docker - 在 docker 中标记图像

我有一个 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/

相关文章:

docker - 扩展本地 Dockerfile

docker - Jenkins + Docker : How to control docker

docker - 拉取访问被拒绝的存储库不存在或可能需要 docker login

docker - Docker 容器中的 asp.net 核心与 Azure App 服务

docker - 如何将 Docker 容器中的目录挂载到主机?

docker - 什么是容器 list ?

docker - Kubernetes多节点上的Kafka

postgresql - Docker 错误 : standard_init_linux. go:1

ruby-on-rails - 无法运行 rake db :create in Dockerfile

docker - 如何理解 "/bin/true"命令在 "docker run ..."命令中的作