Как создать именованный и последний тег в 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. Создайте и пометьте изображение с помощью 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
    
creack
источник
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
2Fast2BCn
источник
На моей машине (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
Тони
источник