Як створити найменування та останній тег у 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.