1

考虑一个容器镜像,我们称之为BaseContainerImage. 我基于 docker hub 上的容器映像(如果重要,则为 .Net Core 3.1 运行时)构建此容器映像。“基于”是指FROMdocker hub 镜像的引用。

当我构建它时,它的 SHA 为:sha256:9ec7b7481feee3eb141f7321be1df353b1ab8b6bdf0d871717b6f7e90e6ed0f6。(通过检查config.digest容器图像的清单找到。)

然后我去制作一个新的容器镜像,我们调用它ApplicationContainerImage。它基于BaseContainerImage, 使用引用上述 SHA 的标记。构建后,我查看容器映像的清单。

我希望该layers部分包含“父”容器图像的 SHA。 但事实并非如此。

当我比较两者的层时,所有层BaseContainerImage都在ApplicationContainerImage. 所以我知道FROM工作。但我只是不明白为什么 . 的 SHABaseContainerImage被排除在ApplicationContainerImage.

为什么 SHA 的BaseContainerImage层没有列出ApplicationContainerImage

后来的注释:
当我去BaseContainerImage从远程存储库下载时,它告诉我(作为PULL命令输出的一部分,摘要Digest: sha256:a1dd2dfdfc51e7abba1d2db319ba457e7b72f7258f5cefca0ee6ec6845f564b6 显然与上述摘要不匹配。但是当我运行docker manifest inspect完全相同的图像时,config.digestsha256:9ec7b7481feee3eb141f7321be1df353b1ab8b6bdf0d871717b6f7e90e6ed0f6,与我之前得到的相符。

为什么有两个不同的 SHA 值?一个只是为了拉动作吗?

4

1 回答 1

2

您正在混合不同对象的摘要。注册表中的图像包括:

  • Manifest:这是顶层,有自己的摘要,但通常用标签来引用
  • 配置:清单指向这一点,它包括您在检查 docker 映像时看到的默认设置
  • 层:每一层都有自己的摘要,这些通常是注册表中的 tar+gzip,本地拉取时为 tar(未压缩)

清单摘要是最常用的摘要,它用于固定图像以进行拉取。请注意,您可以有一个指向多个特定于平台的清单的清单列表,并且每个清单都有自己的摘要。

配置摘要不应与本地任何内容进行比较,需要从注册表中提取配置 blob,但它与层摘要没有直接关联,也不是清单摘要。

层摘要有时会混淆,因为当您从注册表上的压缩变为本地未压缩时,它们会发生变化。

什么是摘要?这只是内容上的 sha256sum。该文件作为 blob 或清单推送到注册表。由于清单如何包含其他文件的摘要,您最终会得到一个有向无环图 (DAG)。

要查看层重用,请查看图像清单中的实际层。或者您可以查看配置 blob 的层部分(这些摘要会有所不同,因为配置中的层摘要位于未压缩层上)。


这是查看 docker hub 上的两个图像的层重用示例:

$ regctl image manifest alpine:3.13
{
  "schemaVersion": 2,
  "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
  "config": {
    "mediaType": "application/vnd.docker.container.image.v1+json",
    "size": 1472,
    "digest": "sha256:6dbb9cc54074106d46d4ccb330f2a40a682d49dda5f4844962b7dce9fe44aaec"
  },
  "layers": [
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 2811969,
      "digest": "sha256:540db60ca9383eac9e418f78490994d0af424aab7bf6d0e47ac8ed4e2e9bcbba"
    }
  ]
}

$ regctl image manifest redis:alpine
{
  "schemaVersion": 2,
  "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
  "config": {
    "mediaType": "application/vnd.docker.container.image.v1+json",
    "size": 6390,
    "digest": "sha256:1690b63e207f6651429bebd716ace700be29d0110a0cfefff5038bb2a7fb6fc7"
  },
  "layers": [
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 2811969,
      "digest": "sha256:540db60ca9383eac9e418f78490994d0af424aab7bf6d0e47ac8ed4e2e9bcbba"
    },
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 1258,
      "digest": "sha256:29712d301e8c43bcd4a36da8a8297d5ff7f68c3d4c3f7113244ff03675fa5e9c"
    },
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 384200,
      "digest": "sha256:8173c12df40f1578a7b2dfbbc0034a4fbc8ec7c870fd32b9236c2e5e1936616a"
    },
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 7692532,
      "digest": "sha256:8cc52074f78e0a2fd174bdd470029cf287b7366bf1b8d3c1f92e2aa8789b92ae"
    },
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 135,
      "digest": "sha256:aa7854465cce07929842cb49fc92f659de8a559cf521fc7ea8e1b781606b85cd"
    },
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 412,
      "digest": "sha256:6ab1d05b49730290d3c287ccd34640610423d198e84552a4c2a4e98a46680cfd"
    }
  ]
}

从那里您可以看到配置 blob 完全不同(正如预期的那样,它们不是同一张图像),但图像中的层与alpine图像的第一层相同redis:alpine

此处显示的regctl工具可从 github 获得。免责声明,我是作者。

于 2021-06-07T20:42:54.343 回答