Маркировка изображений в докере

У меня есть сервер jenkins, который контролирует репозиторий git и создает изображение докеры при смене кода. Директория .git игнорируется как часть сборки, но я хочу связать хэш-код git с изображением, чтобы я точно знал, какая версия кода была использована для его создания, и проверьте, обновляется ли изображение.

Очевидное решение - пометить изображение чем-то вроде "имя-имя-ветки-имя-commit-hash", но для многих ветвей разработки я хочу только сохранить последнюю хорошую сборку, а добавление большего количества меток сделает очистку (вместо того, чтобы использовать номер сборки jenkins при построении образа, а затем перетащить на: последний и немаркирующий номер сборки)

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

Единственный способ, с помощью которого я могу применить ярлык непосредственно к изображению, находится в файле Docker, который не может использовать переменные среды сборки, поэтому мне нужно будет использовать какой-то шаблон для создания пользовательского файла Docker.

Другим способом применения метки является запуск контейнера из изображения с помощью некоторой простой команды (например, bash) и передача меток в качестве аргументов запуска докеров. Затем контейнер можно передать как новое изображение. Это приводит к неудачному побочному эффекту создания команды по умолчанию для изображения, которая использовалась с контейнером для маркировки (поэтому bash в этом случае), а не тем, что было в исходном файле Docker. Для моего приложения я не могу использовать фактическую команду, так как она начнет изменять состояние приложения.

Ни один из них не кажется особенно идеальным - кто-нибудь еще нашел лучший способ сделать это?

Ответ 1

Поддержка этого была добавлена ​​в docker v1.9.0, поэтому обновление вашей установки докеров для этой версии устранит вашу проблему, если с вами все в порядке.

Использование описано в запросе pull-ниже:

https://github.com/docker/docker/pull/15182


В качестве примера возьмем следующий файл Dockerfile:

FROM busybox
ARG GIT_COMMIT=unkown
LABEL git-commit=$GIT_COMMIT    

и постройте его в изображении с именем test, поскольку любой мог бы наивно:

docker build -t test .

Затем проверьте изображение test, чтобы проверить, какое значение получилось для метки git-commit:

docker inspect -f '{{index .ContainerConfig.Labels "git-commit"}}' test

Unkown

Теперь создайте изображение еще раз, но на этот раз с помощью параметра --build-arg:

docker build -t test --build-arg GIT_COMMIT=0123456789abcdef .

Затем проверьте изображение test, чтобы проверить, какое значение получилось для метки git-commit:

docker inspect -f '{{index .ContainerConfig.Labels "git-commit"}}' test

0123456789abcdef


Литература:

  • Документация команды сборки Docker для опции --build-arg
  • Ссылка Dockerfile для директивы ARG
  • Ссылка на dockerfile для LABEL директива

Ответ 2

Вы можете указать метку в командной строке при создании изображения. Таким образом, вы должны написать что-то вроде

docker build -t myproject --label "myproject.version=githash" .

вместо жесткого кодирования версии вы также можете получить ее непосредственно из git:

docker build -t myproject --label "myproject.version=`git describe`" .

Чтобы прочитать метку с ваших изображений, вы можете использовать docker inspect со строкой формата:

docker inspect -f '{{index .Config.Labels "myproject.version"}}' myproject