在docker中标记图像

use*_*072 18 docker

我有一个jenkins服务器监视git repo并在代码更改时构建docker镜像..git目录作为构建的一部分被忽略,但我想将git commit hash与图像相关联,以便我确切地知道用于创建它的代码版本并检查图像是否是最新的.

显而易见的解决方案是使用"application-name-branch-name:commit-hash"之类的标签来标记图像,但是对于许多开发分支我只想保留最后的良好构建,添加更多标记将清理旧版本更难(而不是在构建图像时使用jenkins构建编号,然后重新标记为:最新并取消构建编号)

另一种可能性是标签,但虽然这看起来很有希望,但事实证明它们更复杂.

我可以看到直接将标签应用于图像的唯一方法是Dockerfile,它不能使用构建环境变量,因此我需要使用某种模板来生成自定义Dockerfile.

应用标签的另一种方法是使用一些简单的命令(例如bash)从图像中启动容器,并将标签作为docker run arguments传递.然后可以将容器作为新图像提交.这有一个令人遗憾的副作用是使图像的默认命令与标签容器一起使用(在这种情况下是bash),而不是原始Dockerfile中的任何内容.对于我的应用程序,我无法使用实际命令,因为它将开始更改应用程序状态.

这些似乎都不是特别理想 - 还有其他人找到了更好的方法吗?

小智 21

在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    
Run Code Online (Sandbox Code Playgroud)

并将其构建为一个名为test任何人都会天真地做的图像:

docker build -t test .
Run Code Online (Sandbox Code Playgroud)

然后检查test图像以检查git-commit标签的最终值:

docker inspect -f '{{index .ContainerConfig.Labels "git-commit"}}' test
Run Code Online (Sandbox Code Playgroud)

不明

现在,再次构建图像​​,但这次使用--build-arg选项:

docker build -t test --build-arg GIT_COMMIT=0123456789abcdef .
Run Code Online (Sandbox Code Playgroud)

然后检查test图像以检查git-commit标签的最终值:

docker inspect -f '{{index .ContainerConfig.Labels "git-commit"}}' test
Run Code Online (Sandbox Code Playgroud)

0123456789ABCDEF


参考文献:

  • --build-arg选项的Docker构建命令文档
  • ARG指令的Dockerfile参考
  • LABEL指令的Dockerfile参考

  • 此解决方案不使用构建过程中的信息(发生在容器内部)来创建标签,它要求在容器外部知道元数据.我相信OP与我的情况相同,我们希望通过标签公开内部​​构建的元数据.例如,我可能想要为执行特定RUN命令后确定的代码覆盖添加标签. (2认同)