Как создать именованный и последний тег в Docker?


241

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

Я ожидаю, что однажды у меня появятся дополнительные версии этого образа, поэтому я перезапущу процесс, просто с другим именем тега.

Все идет нормально. Это прекрасно работает и все хорошо.

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

Как мне это сделать? Мне действительно нужно повторно запустить docker buildту же версию, но на этот раз использовать другой тег, есть ли лучший вариант?


Ответы:


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. Создайте и пометьте изображение с помощью creack / node: последнее

    $ 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
Кажется, это больше не работает? Команда build не возвращает идентификатор изображения, ID содержит весь журнал сборки
— Nicolas Mommaerts

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

Это хорошо работает с чем-то вродеREV=$(hg identify --num)
— analytik

2
Чтобы заставить последний тег работать должным образом, вы, вероятно, захотите сделать это docker tag -f $ID creack/node:latestдля того, чтобы принудительно пометить тег последним (в случае, если предыдущее изображение уже было последним)
— treaz

4
Используйте: ID = $ (сборка докера -q -t myrepo / myname: mytag.). «-Q» означает, что в стандартный вывод записывается только идентификатор. Вы должны всегда указывать тег, как если бы вы этого не делали, будет использоваться тег «последний», даже если вы строите старую ветку.
— Дэвид Руссел

44

Вот мой скрипт bash

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' ' ')

или

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

В Docker 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.