docker镜像ID与清单中的ID之间有什么关系?

dei*_*tch 8 docker docker-registry

我试图理解docker images(或docker inspect)报告的图像ID 与注册表或清单中的实际图层或图像(使用v2)之间的联系.

我运行码头图像,我得到(缩写和更改以保护不那么无辜):

REPOSITORY                                             TAG                 IMAGE ID
my.local.registry/some/image      latest              abcdefg
Run Code Online (Sandbox Code Playgroud)

如果我使用API​​拉出上面图像的清单,我会得到一个包含fsLayers,而不是其中一个匹配图像的(完整)ID.我明白了,因为图像是图层的总和.

但是,如果我将该图像拉到别处,我会获得相同的ID.如果我更新图像,推送它,新版本有一个新的ID.

我以为它可能是清单的哈希.但是,(a)通过API提取清单不会返回JSON中清单的哈希值,并且(b)查看注册表目录本身,给定清单中的sha256 /var/lib/registry/v2/repositories/some/image/_manifests/tags/latest/current/link(或那些index/sha256/)给出了正确的链接对于已下载但与图像ID不匹配的清单.

我假设图像ID与blob匹配,但也许我错了?

kau*_*nav 6

当我们将图像推送到注册表中时,

  1. 我们创建了一个定义图像的清单 - 其中的层,并独立推送清单和层。
  2. 我们压缩层,然后才推动它们。

因此,在我们的主机中,我们拥有的哈希值是这些层中存在的内容的哈希值,称为Content Hashes

但是我们将压缩层发送到注册表,因此内容会发生变化,因此哈希值也会发生变化。因此,在发送这些压缩层之前,会计算压缩层的哈希值,称为分布哈希值,并将这些哈希值放入清单文件中。

由于这些内容和分发哈希的不同,您会看到 id 的不同。