我仍在尝试从注册表中成功删除映像,因此想知道注册表是否会接受并添加具有特定标记的 docker 映像,该标记已在注册表中。
假设我将 myImage:myTag 推送到注册表,它就在那里。现在假设我尝试将相同的 myImage:myTag(相同的摘要/sha#)推送到注册表。注册表会发生什么?会出现重复项还是会因为相同的特定 docker 映像已经存在而忽略推送?
我仍在尝试从注册表中成功删除映像,因此想知道注册表是否会接受并添加具有特定标记的 docker 映像,该标记已在注册表中。
假设我将 myImage:myTag 推送到注册表,它就在那里。现在假设我尝试将相同的 myImage:myTag(相同的摘要/sha#)推送到注册表。注册表会发生什么?会出现重复项还是会因为相同的特定 docker 映像已经存在而忽略推送?
将push被注册表接受并且新图像将在标签下可用(除非旧图像和新图像相同)。
但它不会被简单地覆盖。在进行推送时,docker逐层比较层,直到有差异。已经存在的图层将不会被上传,但它们将从以前的图像中重复使用。
示例跟踪,当我重新推送相同的图像时:
The push refers to repository [registry.example.com/path/img-name]
fb2fa896af31: Preparing
b16ac8c37c08: Preparing
ab696326a8e4: Preparing
a30f02440bbb: Preparing
b3ad88565092: Preparing
0fcbbeeeb0d7: Preparing
0fcbbeeeb0d7: Waiting
b16ac8c37c08: Layer already exists
a30f02440bbb: Layer already exists
ab696326a8e4: Layer already exists
fb2fa896af31: Layer already exists
b3ad88565092: Layer already exists
0fcbbeeeb0d7: Layer already exists
tag-name: digest: sha256:00594915da86f6d1331a53d525af0a30c87ec73b19429a4ced32ea92b0741a15 size: 666
图像通常由各个层存储(并上传或下载)。这也解释了,删除某个标记的图像实际上不会删除任何图像,只是取消标记指针(除非强制执行某种 GC)。