linux - Docker 历史基础镜像添加 :sha256hash

标签 linux docker hash dockerfile sha256

我试图更好地理解 docker history 输出。当我运行 docker history nginx:latest 时,我得到的输出几乎与 Dockerfile 匹配:

/bin/sh -c #(nop) CMD ["nginx" "-g" "daemon off;"]
/bin/sh -c #(nop) EXPOSE 443/tcp 80/tcp/bin/sh -c ln -sf /dev/stdout /var/log/nginx/access.log  && ln -sf /dev/stderr /var/log/nginx/error.log
/bin/sh -c apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62  && echo "deb http://nginx.org/packages/mainline/debian/ jessie nginx" >> /etc/apt/sources.list && apt-get update && apt-get install --no-install-recommends --no-install-suggests -y       ca-certificates nginx=${NGINX_VERSION} nginx-module-xslt nginx-module-geoip nginx-module-image-filter nginx-module-perl nginx-module-njs gettext-base  && rm -rf /var/lib/apt/lists/*
/bin/sh -c #(nop) ENV NGINX_VERSION=1.11.9-1~jessie
/bin/sh -c #(nop) MAINTAINER NGINX Docker Maintainers "docker-maint@nginx.com"
/bin/sh -c #(nop) CMD ["/bin/bash"]
/bin/sh -c #(nop) ADD file:89ecb642d662ee7edbb868340551106d51336c7e589fdaca4111725ec64da957 in /

除了三个值得注意的异常(exception)

  1. 所有行都以 /bin/sh -c#(nop) 开头,除了第三行是 Dockerfile 中的 RUN 命令 - 没什么大不了的
  2. 命令是相反的(Dockerfile 中的最后一个命令是 docker history 列出的第一个命令)——也没什么大不了的
  3. 这是关键 - Dockerfile 中的 FROM debian:jessie 行被翻译成:

    在/中添加文件:89ecb642d662ee7edbb868340551106d51336c7e589fdaca4111725ec64da957 CMD ["/bin/bash"]

我花了一点时间才意识到上面的最后两个命令(ADDCMD ["/bin/bash"] 行)是从基本镜像 debian:jessie。弄清楚这一点后,我心想,“我自己,file:89ec...da957 一定是作为文件系统包含的 rootfs.tar.xz 的 sha256 哈希值。但不,sha256 rootfs.tar.xz 的哈希值是 467328e24c316fd058f086eb8eb77706f3f448ad8886d202e7c9687d30692eca

这就是我的问题:docker history 中列出的哈希从何而来?为什么它与 rootfs.tar.xz 的实际哈希不同?

我已经彻底审查了 Docker 的大部分文档,但运气不佳,包括:

  1. https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/
  2. https://docs.docker.com/engine/reference/commandline/history/
  3. https://docs.docker.com/engine/reference/builder/

散列在所有使用 debian:jessie 作为基础镜像的镜像中是一致的。甚至 docker history debian:jessie 也显示相同的散列:

/bin/sh -c #(nop) CMD ["/bin/bash"]
/bin/sh -c #(nop) ADD file:89ecb642d662ee7edbb868340551106d51336c7e589fdaca4111725ec64da957 in /

我想您可能会同意,debian:jessie Dockerfile 中只有一个文件可能具有哈希值:

FROM scratch
ADD rootfs.tar.xz /
CMD ["/bin/bash"]

如果有人能提供一些见解或指出我尚未找到的资源,我们将不胜感激。

最佳答案

docker brew debian image由中间容器制成,如“Understand images, containers, and storage drivers”中所述。

https://docs.docker.com/engine/userguide/storagedriver/images/image-layers.jpg

参见 issue 25925 :每一层都存储在(例如)/var/lib/docker/aufs/mnt/

So ADD file:89ecb642d662ee7edbb868340551106d51336c7e589fdaca4111725ec64da95 would add all files found in /var/lib/docker/aufs/mnt/89ecb642d662ee7edbb868340551106d51336c7e589fdaca4111725ec64da95.

(注意:我在“Docker missing layer IDs in output”中提到了(nop)部分)

关于linux - Docker 历史基础镜像添加 :sha256hash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41972328/

相关文章:

python - AWS elastic beanstalk 上的 tensorflow GPU - 调用 "python"+ "sudo"时出现 tf 导入错误(libcublas.so.9.0 错误)

docker - 我的 docker 启动了Zookeeper,但随后它自动存在

ruby - 使用空数组意外行为初始化哈希

Java SHA256 输出不同的散列到 PHP SHA256?

mysql - SHA256/SHA512 : MySQL Code for Password Hashing and Salting

linux - 尝试在脚本中重定向

linux - 文件系统占用的全部空间

java - 如何在java中包含另一个页面中的一个页面?

git - Docker镜像git clone错误 “fatal: Not a git repository”

Docker-entrypoint.sh 为带有 golang 的 ARM 镜像生成 "not found"