我正在尝试了解docker images
(或docker inspect
)报告的图片ID与注册表或清单中的实际图层或图片(使用v2)之间的关联。
我运行码头图片,我得到(缩写并更改以保护不那么无辜):
REPOSITORY TAG IMAGE ID
my.local.registry/some/image latest abcdefg
如果我使用API拉取上面图像的清单,我会得到一个包含fsLayers
的清单,而不是其中一个匹配图像的(完整)ID。我明白了,因为图像是图层的 sum 。
但是,如果我将该图像拉到别处,我会获得相同的ID。如果我更新图像,推送它,新版本有一个新的ID。
我认为它可能是清单的哈希。但是,(a)通过API提取清单不会返回JSON中清单的哈希值,并且(b)查看注册表目录本身,/var/lib/registry/v2/repositories/some/image/_manifests/tags/latest/current/link
中给定清单的sha256(或者index/sha256/
)为下载的清单提供正确的链接,但与图像ID不匹配。
我假设图像ID与blob匹配,但也许我错了?
答案 0 :(得分:2)
当我们将图像推送到注册表时,
因此,在我们的主机中,我们所拥有的哈希是这些层中存在的内容的哈希值,称为内容哈希值。
但是对于注册表,我们发送压缩层,因此内容会发生变化,因此哈希值会发生变化。因此,在发送这些压缩图层之前,会计算压缩图层的哈希值,称为分布哈希值,并将这些哈希值放入清单文件中。
由于这些内容和分布哈希值不同,您会看到ID的差异。