Ответ 1
При создании изображения вы можете иметь несколько тегов:
$ docker build -t whenry/fedora-jboss:latest -t whenry/fedora-jboss:v2.1 .
Ссылка: https://docs.docker.com/engine/reference/commandline/build/#tag-image-t
Предположим, у меня есть изображение, которое я хочу пометить как 0.10.24
(в моем случае это изображение, содержащее Node.js 0.10.24). Я построил это изображение с помощью Dockerfile и выполнил docker build
и предоставил тег, используя параметр -t
.
Я ожидаю, что однажды у меня появятся дополнительные версии этого образа, поэтому я перезапущу процесс, просто с другим именем тега.
До сих пор так хорошо. Это прекрасно работает, и все хорошо.
Но, и здесь проблемы начинаются, я также хочу, чтобы всегда было добавлено новое объявление с тегами latest
. Поэтому, я думаю, мне нужно дать два имени одному и тому же изображению.
Как мне это сделать? Мне действительно нужно снова запустить docker build
в той же самой версии, но на этот раз использовать другой тег, есть ли лучший вариант?
При создании изображения вы можете иметь несколько тегов:
$ docker build -t whenry/fedora-jboss:latest -t whenry/fedora-jboss:v2.1 .
Ссылка: https://docs.docker.com/engine/reference/commandline/build/#tag-image-t
Как только у вас есть ваше изображение, вы можете использовать
$ docker tag <image> <newName>/<repoName>:<tagName>
Постройте и пометьте изображение с помощью creack/node: последнее
$ ID=$(docker build -q -t creack/node .)
Добавить новый тег
$ docker tag $ID creack/node:0.10.24
Вы можете использовать это и пропустить часть -t из сборки
$ docker tag $ID creack/node:latest
Вот мой скрипт 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
ID=$(docker build -t creack/node .)
не работает для меня, так как ID
будет содержать вывод из сборки.
SO Я использую этот небольшой BASH script:
#!/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
Просто grep ID от 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
или файл журнала.
Изменение ответа Аарона. Использование 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