如何防止docker hub上的docker镜像被覆盖?

时间:2015-07-24 08:27:32

标签: docker dockerhub continuous-delivery

有没有办法阻止图像使用与现有图像相同的标记上传到docker hub?我们的用例如下。

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

但是,您可以使用摘要。在注册表的新v2中,所有图像都被赋予校验和,称为摘要。如果图像或其任何基础层发生变化,摘要将发生变化。因此,如果你通过摘要,你可以绝对确定该图像的内容没有随时间变化,并且图像没有被篡改。

通过摘要拉取看起来像:

docker pull debian@sha256:f43366bc755696485050ce14e1429c481b6f0ca04505c4a3093dfdb4fafb899e

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

现在,我同意通过摘要拉动有点笨拙,所以你可能想要建立一个只跟踪摘要和标签的系统,并且可以验证图像没有改变。

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

答案 1 :(得分:2)

假设您有一个本地构建系统来构建Docker镜像:您可以在标记中包含本地构建作业的内部版本号。有了这些,您可以确保您的要求:

  

...某个标记的泊坞窗图像必须始终引用同一图像。

当您的本地版本自动推送到Docker hub时,可确保每次推送都会使用唯一标记推送图像。