我有一台jenkins服务器监控git repo并在代码更改时构建一个docker镜像。 .git目录作为构建的一部分被忽略,但我想将git commit hash与图像相关联,以便我确切地知道用于创建它的代码的版本并检查图像是否是最新的。 / p>
显而易见的解决方案是使用类似“application-name-branch-name:commit-hash”的标记来标记图像,但是对于许多开发分支我只想保留最后的良好构建,并且添加更多标记将使清理旧的构建更难(而不是在构建图像时使用jenkins构建编号,然后重新标记为:最新并取消构建编号)
另一种可能性是标签,但虽然这看起来很有希望,但实际上它们更复杂。
我可以看到直接将标签应用于图像的唯一方法是在Dockerfile中,它不能使用构建环境变量,因此我需要使用某种模板来生成自定义Dockerfile。
应用标签的另一种方法是使用一些简单的命令(例如bash)从映像启动容器,并将标签作为docker run arguments传入。然后可以将容器作为新图像提交。这有一个令人遗憾的副作用是使图像的默认命令与标签容器一起使用(在这种情况下是bash),而不是原始Dockerfile中的任何内容。对于我的应用程序,我无法使用实际命令,因为它将开始更改应用程序状态。
这些似乎都不是特别理想 - 还有其他人找到了更好的方法吗?
答案 0 :(得分:20)
在docker v1.9.0中添加了对此的支持,因此将docker安装更新到该版本可以解决您的问题,如果可以的话。
用法在下面的pull-request中描述:
https://github.com/docker/docker/pull/15182
例如,请使用以下 Dockerfile 文件:
FROM busybox
ARG GIT_COMMIT=unknown
LABEL git-commit=$GIT_COMMIT
并将其构建为名为test
的图像,就像任何人都天真地做的那样:
docker build -t test .
然后检查test
图片以检查git-commit
标签的最终值:
docker inspect -f '{{index .ContainerConfig.Labels "git-commit"}}' test
未知
现在,再次构建图片,但这次使用 --build-arg
选项:
docker build -t test --build-arg GIT_COMMIT=0123456789abcdef .
然后检查test
图片以检查git-commit
标签的最终值:
docker inspect -f '{{index .ContainerConfig.Labels "git-commit"}}' test
0123456789ABCDEF
参考文献:
--build-arg
选项ARG
指令的Dockerfile参考LABEL
指令的Dockerfile参考答案 1 :(得分:0)
You can specify a label on the command line when creating your image. So you would write something like
docker build -t myproject --label "myproject.version=githash" .
instead of hard-coding the version you can also get it directly from git:
docker build -t myproject --label "myproject.version=`git describe`" .
To read out the label from your images you can use docker inspect
with a format string:
docker inspect -f '{{index .Config.Labels "myproject.version"}}' myproject
答案 2 :(得分:0)
如果您使用的是docker-compose,则可以add the following to the build
section:
labels:
git-commit-hash: ${COMMIT_HASH}
其中COMMIT_HASH
是您的environment variable,其中包含提交哈希。