我有一个 jenkins 服务器监控一个 git repo 并在代码更改时构建一个 docker 镜像。 .git 目录作为构建的一部分被忽略,但我想将 git 提交哈希与图像相关联,以便我确切知道用于制作它的代码版本并检查图像是否是最新的。
显而易见的解决方案是用“application-name-branch-name:commit-hash”之类的标记图像,但对于许多开发分支我只想保留最后一个好的构建,添加更多标签会进行清理升级旧版本更难(而不是在构建镜像时使用 jenkins 版本号,然后重新标记为 :latest 并取消标记版本号)
另一种可能性是标签,虽然这最初看起来很有希望,但在实践中证明它们更复杂..
我可以看到将标签直接应用于图像的唯一方法是在 Dockerfile 中,它不能使用构建环境变量,所以我需要使用某种模板来生成自定义 Dockerfile。
另一种应用标签的方法是使用一些简单的命令(例如 bash)从镜像启动一个容器,并将标签作为 docker run 参数传递。然后可以将容器提交为新镜像。这有一个不幸的副作用,即使图像的默认命令与标签容器一起使用(在这种情况下为 bash),而不是原始 Dockerfile 中的任何命令。对于我的应用程序,我无法使用实际命令,因为它将开始更改应用程序状态。
这些似乎都不是特别理想 - 有其他人找到更好的方法吗?
最佳答案
在 docker v1.9.0 中添加了对此的支持,因此如果您同意,将您的 docker 安装更新到该版本将解决您的问题。
用法在下面的拉取请求中描述:
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
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
引用资料:
--build-arg
选项的 Docker 构建命令文档ARG
指令的 Dockerfile 引用LABEL
指令的 Dockerfile 引用https://stackoverflow.com/questions/31647843/