Як створити найменування та останній тег у Docker?


241

Припустимо, у мене є зображення, на якому я хочу позначати тег 0.10.24(у моєму випадку це зображення, що містить Node.js 0.10.24). Я створив це зображення за допомогою Dockerfile та виконання docker buildта надання тегу за допомогою -tпараметра.

Я очікую, що одного дня у мене з’являться додаткові версії цього зображення, тому я повторюю процес, просто з іншим ім'ям тегу.

Все йде нормально. Це чудово і добре, і все добре.

Але ось тут починаються проблеми, я також хочу завжди мати найновіше зображення з тегом latest. Тож я думаю, мені потрібно дати два імені саме такому ж зображенню.

Як це зробити? Мені справді потрібно знову запустити docker buildцю саме версію, але на цей раз використати інший тег, чи є кращий варіант?


Питання, пов’язані з цим: stackoverflow.com/questions/21928780/…
Марк Батлер

Відповіді:


267

Під час створення зображення можна мати кілька тегів:

$ docker build -t whenry/fedora-jboss:latest -t whenry/fedora-jboss:v2.1 .

Довідка: https://docs.docker.com/engine/reference/commandline/build/#tag-image-t


23
Ви також можете залишити :latestчастину, тому що це за замовчуванням:docker build -t whenry/fedora-jboss -t whenry/fedora-jboss:v2.1 .
TemporalWolf

161

Коли у вас є ваш образ, ви можете використовувати

$ docker tag <image> <newName>/<repoName>:<tagName>
  1. Побудувати та позначити зображення за допомогою скрипу / вузла: останнє

    $ ID=$(docker build -q -t creack/node .)
    
  2. Додати новий тег

    $ docker tag $ID creack/node:0.10.24
    
  3. Ви можете скористатися цим і пропустити частину -t від збірки

    $ docker tag $ID creack/node:latest
    

4
Здається, це більше не працює? Команда збірки не повертає ідентифікатор зображення, ID містить весь журнал збирання
Nicolas Mommaerts

14
Журнали збірки повинні бути на stderr, ви можете відкрити bugreport на github. В іншому випадку, коли ви будуєте з -t, ви можете використовувати безпосередньо даний тег і повністю відкинути ідентифікатор зображення. У моєму прикладі, перший рядок створює зображення creack/node:latest, потім ви можете позначити його тегомdocker tag creack/node:latest creack/node:0.10.24
скрип

Це добре працює з чимось на кшталтREV=$(hg identify --num)
analytik

2
Щоб остання тег запрацювала належним чином, ви, ймовірно, захочете це зробити docker tag -f $ID creack/node:latest, щоб змусити теги бути останніми (у випадку, якщо попереднє зображення вже було останнім)
treaz

4
Використання: ID = $ (docker build -q -t myrepo / myname: mytag.). "-Q" означає, що для stdout записується лише ідентифікатор. Ви завжди повинні вказувати тег, так як якщо ви не використовуєте тег "останнє", навіть якщо ви будуєте стару гілку.
Девід Руссель

44

Ось мій баш сценарій

docker build -t ${IMAGE}:${VERSION} .
docker tag ${IMAGE}:${VERSION} ${IMAGE}:latest

Потім ви можете видалити немальовані зображення, якщо ви відновили ту саму версію

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

посилання

або

docker rmi $(docker images | grep "^<none>" | tr -s " " | cut -d' ' -f3 | tr '\n' ' ')

або

Очистити команди :

Докер 1.13 вводить команди очищення. Щоб видалити всі невикористані контейнери, зображення, мережі та томи:

docker system prune

або окремо:

docker container prune
docker image prune
docker network prune
docker volume prune

На моїй машині (Ubuntu 14.04) awk '{print $3}'працює, але не awk "{print $3}"дуже команда, яку я використовую,docker rmi $(docker images -a | grep "^<none>" | awk '{print $3}')
похмурий

1
НЕ -fваріант більше не існує docker tag. Використання простоdocker tag IMAGE[:TAG] IMAGE[:TAG]
jwadsack

@ 2Fast2BCn: якщо припустити, що ви також потребуєте docker pushпісля docker build & docker run, чи натискаєте з :latestабо ${VERSION}?
Ідан Адар

Ви можете підштовхнути і те, і інше. У будь-якому випадку він зберігатиме його лише один раз.
2Fast2BCn

19

ID=$(docker build -t creack/node .)не працює для мене, оскільки IDбуде містити вихід з збірки.

Так що я використовую цей невеликий сценарій BASH:

#!/bin/bash

set -o pipefail

IMAGE=...your image name...
VERSION=...the version...

docker build -t ${IMAGE}:${VERSION} . | tee build.log || exit 1
ID=$(tail -1 build.log | awk '{print $3;}')
docker tag $ID ${IMAGE}:latest

docker images | grep ${IMAGE}

docker run --rm ${IMAGE}:latest /opt/java7/bin/java -version

1
Або ви можете просто перейти -q/ --quietдо, buildяк згадується у цій відповіді
driftcatcher

8

Просто оберіть ідентифікатор від docker images:

docker build -t creack/node:latest .
ID="$(docker images | grep 'creak/node' | head -n 1 | awk '{print $3}')"
docker tag "$ID" creack/node:0.10.24
docker tag "$ID" creack/node:latest

Не потребує тимчасового файлу і дає повний вихід на збірку . Ви все одно можете перенаправити його на /dev/nullфайл або файл журналу.


5

Варіація відповіді Аарона. Використання sed без тимчасових файлів

#!/bin/bash
VERSION=1.0.0
IMAGE=company/image
ID=$(docker build  -t ${IMAGE}  .  | tail -1 | sed 's/.*Successfully built \(.*\)$/\1/')

docker tag ${ID} ${IMAGE}:${VERSION}
docker tag -f ${ID} ${IMAGE}:latest
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.