Docker镜像的Image ID和Digest有什么区别?

97

这对我来说确实很困惑。我认为Docker的Image ID就是它的SHA256哈希值。然而,显然通过docker image ls --digests命令得到的结果(列在DIGEST列下)与该镜像的IMAGE ID不同。

例如:

docker image ls --digests alpine
REPOSITORY          TAG                 DIGEST                                                                    IMAGE ID            CREATED             SIZE
alpine              latest              sha256:769fddc7cc2f0a1c35abb2f91432e8beecf83916c421420e6a6da9f8975464b6   055936d39205        2 weeks ago         5.53MB
docker image ls --no-trunc
REPOSITORY                                             TAG                 IMAGE ID                                                                  CREATED             SIZE
...
alpine                                                 latest              sha256:055936d3920576da37aa9bc460d70c5f212028bda1c08c0879aedf03d7a66ea1   2 weeks ago         5.53MB

很明显,sha256:055936d3920576da37aa9bc460d70c5f212028bda1c08c0879aedf03d7a66ea1(镜像ID)和sha256:769fddc7cc2f0a1c35abb2f91432e8beecf83916c421420e6a6da9f8975464b6(摘要)不是同一个值。但为什么呢?在相同的镜像中有两个不同sha256哈希值的目的是什么?它们分别如何计算?

当我读Docker Deep Dive这本书时,我对此感到困惑,也没有在书上或在线上找到清晰的答案。


7
看看这个链接,它讨论了为什么新创建的Docker镜像没有摘要。 - Michał Krzywański
4
谢谢您的评论,@michalk。它提供了清晰的解释。我想知道为什么这种区别没有被更多地提到。 - xji
1个回答

80

感谢michalk的评论。简短的回答是:

  • "摘要"是Docker registry v2引入的manifest文件的哈希值。
  • 镜像ID是本地镜像JSON配置的哈希值。

11
“manifest”和“JSON配置”...你把这个问题“放在下面”了。这两者有什么区别呢? - Otheus
如果您使用 regctl manifest get IMAGE,您可以看到一个清单包装了一个配置和一些层。配置还包含一堆 rootfs (层) 对象,sha 校验和不同(在清单和配置之间),因为清单的层是在压缩后的,而配置的 rootfs 是在压缩前的。这个清单是较新的,所以我猜它在向后兼容方面有些多余。 - Iskren Ivov Chernev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接