如何防止docker集线器上的docker图像被覆盖?

有没有办法阻止图像上传到docker集线器与现有的图像相同的标签? 我们的用例如下。

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

然而,docker中心允许图像上传与现有图像相同的标签(他们覆盖旧图像)。 这完全打破了版本化图像的想法。

我们目前有一些解决方法,涉及我们的构build脚本,拉取图像的所有版本,并通过标签来检查覆盖不会发生等,但感觉好像还有更好的方法。

如果docker中心不支持这个,有没有一种方法来执行docker部署没有docker中心?

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

…某个标记的泊坞窗图像总是指向相同的图像是必要的。

当您的本地版本自动推入docker集线器时,确保每次推送都使用唯一标签推送图像。

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

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

摘要看起来像:

 docker pull debian@sha256:f43366bc755696485050ce14e1429c481b6f0ca04505c4a3093dfdb4fafb899e 

你应该得到摘要,当你做docker push

现在,我同意,通过摘要拉动有点笨拙,所以你可能想build立一个系统,只是简单地跟踪摘要和标签,并可以validation图像没有改变。

在未来,这种情况可能会得到改善,像公证人这样的工具来签署图像。 此外,你可能想看看使用标签来存储元数据,如git散列或内部版本号。