在Docker中标记图像

我有一个jenkins服务器监控一个git repo,并在代码更改上构build一个docker镜像。 .git目录作为构build的一部分被忽略,但我想将git commit hash与图像关联起来,这样我就可以确切地知道使用哪个版本的代码来检查图像是否是最新的。

显而易见的解决scheme是用“application-name-branch-name:commit-hash”来标记图像,但是对于许多开发分支,我只想保持最后的良好构build,添加更多标记将清理旧构build更难(而不是使用jenkins内部版本号,因为图像是build立,然后retagging:最新和untagging内部版本号)

另一种可能性是标签,但是尽pipe起初看起来很有希望,但在实践中certificate它们更复杂。

我可以看到直接应用标签到图像的唯一方法是在Dockerfile,它不能使用构build环境variables,所以我需要使用某种模板来产生一个自定义的Dockerfile。

另一种应用标签的方法是使用一些简单的命令(例如bash)从图像中启动容器,并将标签作为docker运行参数传入。 然后容器可以作为新的图像提交。 这有一个不幸的副作用,使图像的默认命令无论是与标签容器(在这种情况下,所以bash),而不是在原始的Dockerfile中。 对于我的应用程序,我不能使用实际的命令,因为它会开始改变应用程序状态。

这些都不是特别理想 – 有没有人find更好的方法呢?

在docker v1.9.0中添加了对此的支持,因此,如果将docker安装到该版本,则可以解决您的问题。

用法在下面的拉取请求中描述:

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


作为一个例子,采取以下Dockerfile文件:

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

并build立一个名为test的图像,任何人都会天真地做:

 docker build -t test . 

然后检查test图像来检查git-commit标签的值是什么:

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

不明

现在,再次构build图像​​,但是这次使用--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选项的命令文档
  • ARG指令的Dockerfile参考
  • 用于LABEL指令的Dockerfile参考