当前位置: 首页 > 知识库问答 >
问题:

如何生成docker镜像Layer DiffID?

慕容烨
2023-03-14

我阅读了Docker映像规范v1.2.0。上面说:

层由其序列化表示的加密哈希引用。这是用于传输层的tar存档上的SHA256摘要,表示为256位的十六进制编码,例如,SHA256:A9561EB1B190625C9ADB5A9513E72C4DEDAFC1CB2D5236C9A6957DFD5A9。层必须重复打包和解包,以避免更改层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个答案

颛孙晗昱
2023-03-14

从技术上讲,你确实回答了自己的问题。这是Docker图像规范所说的(正如您所引用的):

[DiffID]是tar归档上的SHA256摘要,用于传输层(…)请注意,用作层ID的摘要接管了tar的未压缩版本。]"

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

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

如果您查看清单。json,您将看到rootfs。diff\u id数组指向通过sha256sum层获得的相同哈希。焦油。您计算的哈希是DiffID。

接下来显而易见的问题是:这个目录名是从哪里来的?!

我不确定,但它似乎是由在旧的Docker图像格式v1上生成层ID所使用的任何算法生成的。当时,图像和层被合并为一个概念。

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

脚注:AFAIU,Docker图像格式规范被OCI图像格式规范取代,但Docker图像保存似乎以旧的Docker格式生成存档。)

 类似资料:
  • 有一个应用是这样安装的,以root身份登陆vps(debian11): 我可否为这个应用制作一个docker镜像呢?用docker run来达到我上面那些代码的目的? 报错了 我的镜像源 我的本地代理可以使用 在构建镜像时,使用代理 还是报错

  • 生成内核镜像 安装 binutils 工具集 为了查看和分析生成的可执行文件,我们首先需要安装一套名为 binutils 的命令行工具集,其中包含了 objdump 和 objcopy 等常用工具。 Rust 社区提供了一个 cargo-binutils 项目,可以帮助我们方便地调用 Rust 内置的 LLVM binutils。我们用以下命令安装它: 运行命令 cargo install car

  • 拉取官方 Docker 镜像 docker pull apache/shardingsphere-proxy 手动构建 Docker 镜像(可选) git clone https://github.com/apache/shardingsphere mvn clean install cd shardingsphere-distribution/shardingsphere-proxy-dist

  • 使用dockerfile打包太麻烦了!比如我想自己搭建一套php的开发环境,做成镜像,以后随时可用。并且我习惯使用堡塔作为面板工具。如果使用dockerfile的化,成本就太高了。 使用commit或者import/export的方式会导致镜像非常大! 是否有其他高效的打包方式可以,将容器打包成镜像?

  • 以下步骤指导您构建自己的Envoy二进制文件,并将其放入干净的Ubuntu容器中。 第1步:构建Envoy 使用envoyproxy/envoy-build编译Envoy。该镜像具有构建Envoy所需的全部软件。在您的Envoy目录中执行如下命令: $ pwd src/envoy $ ./ci/run_envoy_docker.sh './ci/do_ci.sh bazel.release' 执

  • 官方最佳实践文档 Best practices for writing Dockerfiles 明确指定镜像版本 构建镜像时,建议明确指定包含版本或者其他辅助信息的tag。 如果不指定镜像tag,默认会使用latest。这种方式不利于版本管理,对应用启动速度也有一定影响(每次启动应用实例时,都需要去镜像仓库检查镜像是否更新) 减小镜像大小 使用alpine版本的基础镜像 alpine是一个高度精简