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

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

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

До сих пор так хорошо. Это прекрасно работает, и все хорошо.

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

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

Ответ 2

Как только у вас есть ваше изображение, вы можете использовать

$ 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
    

Ответ 3

Вот мой скрипт 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

Ответ 4

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

Ответ 5

Просто 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 или файл журнала.

Ответ 6

Изменение ответа Аарона. Использование 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