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

时间:2016-01-02 17:39:21

标签: docker docker-registry

我正在尝试了解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匹配,但也许我错了?

1 个答案:

答案 0 :(得分:2)

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

  1. 我们创建一个清单来定义图像 - 其中的图层,并单独推送清单和图层。
  2. 我们压缩图层然后推它们。
  3. 因此,在我们的主机中,我们所拥有的哈希是这些层中存在的内容的哈希值,称为内容哈希值

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

    由于这些内容和分布哈希值不同,您会看到ID的差异。