Как создать именованный и последний тег в 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.