【问题标题】:How to prevent docker images on docker hub from being overwritten?如何防止 docker hub 上的 docker 镜像被覆盖?
【发布时间】:2015-07-24 08:27:32
【问题描述】:

有什么方法可以防止图像被上传到 docker hub 并带有与现有图像相同的标签?我们的用例如下。

我们使用带有图像标签作为版本号的 docker-compose 文件部署到生产环境。为了支持回滚到以前的环境和幂等部署,某个标记的 docker 镜像必须始终引用同一个镜像。

但是,docker hub 允许使用与现有图像相同的标签上传图像(它们会覆盖旧图像)。这完全打破了对图像进行版本控制的想法。

我们目前有一些变通方法,其中涉及我们的构建脚本提取图像的所有版本并查看标签以检查是否不会发生覆盖等,但感觉必须有更好的方法。

如果 docker hub 不支持这个,有没有办法在没有 docker hub 的情况下进行 docker 部署?

【问题讨论】:

  • 重读了这篇,我不太明白。你是什​​么意思“图像标签作为版本号”?你的意思是你使用版本号作为你的图像标签?这就说得通了。但是要检查一个标签是否会被覆盖,你为什么不能直接docker pull image:tag 看看那里有没有什么?
  • 嗯,没想过尝试拉出特定图像来检查标签是否存在,我们只是拉出所有图像/标签,这很麻烦,好主意。
  • 这是标签应该被设为不可变的另一个原因。我有类似的问题,我不能保证我的某些图像(带有特定标签)的本地版本与所有其他节点上的相同。除此之外,DOCKER ROCKS!

标签: docker dockerhub continuous-delivery


【解决方案1】:

标签系统无法防止图像被覆盖;你必须想出自己的流程来处理这个问题(h3nrik 的回答就是一个例子)。

但是,您可以改用 digest。在注册表的新 v2 中,所有图像都有一个校验和,称为摘要。如果图像或其任何基础层发生变化,摘要也会发生变化。因此,如果您通过摘要提取,您可以绝对确定该图像的内容没有随着时间的推移而改变,并且该图像没有被篡改。

按摘要拉取如下所示:

docker pull debian@sha256:f43366bc755696485050ce14e1429c481b6f0ca04505c4a3093dfdb4fafb899e

当您执行docker push 时,您应该会得到摘要。

现在,我同意通过摘要拉取有点笨拙,因此您可能希望建立一个系统来简单地跟踪摘要和标签,并可以验证图像没有更改。

未来,这种情况可能会得到改善,使用 Notary 等工具对图像进行签名。此外,您可能希望查看使用标签来存储元数据,例如 git 哈希或内部版本号。

【讨论】:

    【解决方案2】:

    假设您有一个本地构建系统来构建您的 Docker 映像:您可以在标签中包含本地构建作业的构建号。这样您就可以保证您的要求:

    ... 某个标记的 docker 镜像必须始终引用同一个镜像。

    当您的本地构建自动推送到 docker hub 时,可以确保每次推送都会推送一个带有唯一标签的图像。

    【讨论】:

    • 谢谢,我接受这个答案,因为这是我们现在使用的方法(并且有效),但是,我确信 @adrian-mouat 的方法也有效。跨度>
    • 出于好奇,你们使用什么作为 Docker 构建的构建系统?是像 CI 这样的自动化系统,通过推送到 Git 存储库来触发构建?
    • 我们使用 Jenkins 来构建我们的 maven 风格项目。对于 Maven,有很好的 Docker 插件可用。这些构建是通过推送到我们的 Atlassian Stash git 存储库来触发的。
    猜你喜欢
    • 2018-07-17
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2022-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多