【问题标题】:How come two docker images have the same image ID and same tag, but different digests?为什么两个 docker 镜像具有相同的镜像 ID 和相同的标签,但摘要不同?
【发布时间】:2020-03-28 03:18:43
【问题描述】:

当我docker pull hello-world时,我得到了带有f9dfddf63636d84ef479d645ab5885156ae030f611a56f3a7ac7f2fdd86d7e4e摘要的图像

$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
Digest: sha256:f9dfddf63636d84ef479d645ab5885156ae030f611a56f3a7ac7f2fdd86d7e4e
Status: Image is up to date for hello-world:latest
docker.io/library/hello-world:latest

我用的是Mac,但是当我docker inspect hello-world:latest时,我看到os/arch是linux/amd64

    ...
    "Architecture": "amd64",
    "Os": "linux",
    ...

所以我去了https://hub.docker.com/_/hello-world/?tab=tags,发现很奇怪,最新的 linux/amd64 hello-world 位于https://hub.docker.com/layers/hello-world/library/hello-world/latest/images/sha256-92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a?context=explore,摘要为92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a

所以我也拉下了这张图片

$ docker pull hello-world@sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a
sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a: Pulling from library/hello-world
Digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a
Status: Downloaded newer image for hello-world@sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a
docker.io/library/hello-world@sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a

令人惊讶的是,我最终得到了两张具有相同标签、相同图像 ID、但摘要不同的图像。

$ docker image ls --digests
REPOSITORY                    TAG                 DIGEST                                                                    IMAGE ID            CREATED             SIZE
hello-world                   latest              sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a   fce289e99eb9        15 months ago       1.84kB
hello-world                   latest              sha256:f9dfddf63636d84ef479d645ab5885156ae030f611a56f3a7ac7f2fdd86d7e4e   fce289e99eb9        15 months ago       1.84kB

这两张图是同一张吗?如果我想在整个团队中保持一致性,我如何才能唯一地处理图像?

【问题讨论】:

  • 类似问题仍然在 github 上打开。 github.com/moby/moby/issues/36789
  • @nischaygoyal 是的,但这似乎与 moby 无关。
  • @wlnirvana: Moby 肯定是 Docker 的上游项目...

标签: docker dockerhub


【解决方案1】:

-> 这就是清单与 docker 一起工作的方式。两个图像的 Config.digest 文件保持相同,因为它们指向相同的层配置。
-> 用于 docker pull 的摘要表示存储在注册表中的镜像清单的摘要。这个摘要被认为是哈希链的根,因为清单本身包含将被下载并导入到 docker 的内容的哈希。
->有关此清单https://docs.docker.com/registry/spec/manifest-v2-2/ 的描述,请参阅模式 2 规范。 docker 中使用的镜像 id 可以在这个清单中作为 config.digest 找到。此配置表示将在 docker 中使用的映像配置。
->所以你可以说清单是信封,图像是里面的东西。清单摘要将始终与图像 ID 不同,但对于任何给定的清单,应始终生成相同的图像 ID。
-> 因为它是一个哈希链,我们不能保证清单摘要对于给定的图像 id 总是相同的。
-> 在大多数情况下,它通常应该产生相同的摘要,我们不能保证,但会尽力而为。清单摘要的可能差异是因为我们不在本地存储 gzip 压缩的 blob,并且层的导出可能会产生不同的摘要,即使未压缩的内容应该保持不变。
-> 图像 id 本身验证未压缩的内容是否相同,这就是我们说图像 id 现在是内容可寻址标识符的意思。

【讨论】:

猜你喜欢
  • 2019-10-15
  • 2018-09-23
  • 1970-01-01
  • 2022-09-16
  • 2016-12-23
  • 1970-01-01
  • 2019-08-03
  • 2022-11-27
  • 1970-01-01
相关资源
最近更新 更多