在docker中标记图像

时间:2015-07-27 08:02:26

标签: docker

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

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

另一种可能性是标签,但虽然这看起来很有希望,但实际上它们更复杂。

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

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

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

3 个答案:

答案 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选项
  • 的Docker构建命令文档
  • 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,其中包含提交哈希。