Маркировка изображений в докере
У меня есть сервер 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