如何生成docker image Layer DiffID?

时间:2017-11-12 12:55:29

标签: docker docker-image

我阅读了Docker Image Specification v1.2.0。 它说:

  

图层由其序列化表示的加密哈希引用。这是用于传输层的tar存档的SHA256摘要,表示为256位的十六进制编码,例如sha256:a9561eb1b190625c9adb5a9513e72c4dedafc1cb2d4c5236c9a6957ec7dfd5a9。必须可重复地打包和解压缩层以避免更改层ID,例如使用tar-split来保存tar头。请注意,用作图层ID的摘要是在未压缩版本的tar上获取的。

我想找出具体的过程。所以我尝试流动:

chao@manager-02:~/image_lab$ docker image save busybox:1.27-glibc > busybox.tar
chao@manager-02:~/image_lab$ tar -xvf busybox.tar 
47f54add1c481ac7754f9d022c2c420099a16e78faf85b4f2926a96ee40277fe/
47f54add1c481ac7754f9d022c2c420099a16e78faf85b4f2926a96ee40277fe/VERSION
47f54add1c481ac7754f9d022c2c420099a16e78faf85b4f2926a96ee40277fe/json
47f54add1c481ac7754f9d022c2c420099a16e78faf85b4f2926a96ee40277fe/layer.tar
fe2d514cd10652d0384abf2b051422722f9cdd7d189e661450cba8cd387a7bb8.json
manifest.json
repositories
chao@manager-02:~/image_lab$ ls
47f54add1c481ac7754f9d022c2c420099a16e78faf85b4f2926a96ee40277fe  Dockerfile                                                             manifest.json
busybox.tar                                                       fe2d514cd10652d0384abf2b051422722f9cdd7d189e661450cba8cd387a7bb8.json  repositories
chao@manager-02:~/image_lab$ sha256sum 47f54add1c481ac7754f9d022c2c420099a16e78faf85b4f2926a96ee40277fe/layer.tar 
545903a7a569bac2d6b75f18d399251cefb53e12af9f644f4d9e6e0d893095c8  47f54add1c481ac7754f9d022c2c420099a16e78faf85b4f2926a96ee40277fe/layer.tar

为什么我生成的sha256sum不等于图像层的sha256sum?

1 个答案:

答案 0 :(得分:0)

从技术上讲,您确实回答了自己的问题。这就是 Docker image spec 所说的(如您所引):

<块引用>

[DiffID] 是用于传输层的 tar 存档上的 SHA256 摘要 (...) 请注意,用作层 ID 的摘要是通过未压缩版本的 tar 获取的。]"

但后来,在描述图像内容时,同一个文档还说:

<块引用>

图像中的每一层都有一个目录。每个目录都以 64 个字符的十六进制名称命名,该名称是根据图层信息确定性生成的。 这些名称不一定是层 DiffID 或 ChainID。

如果您查看图像的 manifest.json,您会看到 rootfs.diff_ids 数组指向您通过 sha256suming layer.tar 获得的相同哈希。您计算的散列 DiffID。

接下来很明显的问题是:那个目录名是从哪里来的?!

我不确定,但是 it seems 它是由用于在较旧的 Docker 映像格式 v1 上生成层 ID 的任何算法生成的。那时,图像和图层被合并为一个概念。

我猜他们会保持 v1 目录名称不变,以简化旧层与较新 Docker 版本的使用。

脚注:AFAIU,Docker 镜像格式规范已被 OCI 镜像格式规范所取代,但 docker image save 似乎以较旧的 Docker 格式生成档案。)