首页 > 解决方案 > Docker 镜像层:`ADD 文件是什么:在 /` 中是什么意思?

问题描述

在 Docker Hub 镜像中,有为每个镜像层运行的命令列表。这是一个 golang示例

一些应用程序还在 GitHub 中提供其Dockerfile。这是一个 golang示例

根据 Docker Hub 镜像层,ADD file:4b03b5f551e3fbdf47ec609712007327828f7530cc3455c43bbcdcaf449a75a9 in /是第一个命令。图像层没有包含任何“FROM”命令,它似乎也不足以满足ADD 定义

所以这里有问题:

  1. 是什么ADD file:<HASH> in /意思?这是什么格式?
  2. 有什么方法可以使用哈希向上追踪吗?我想哈希代表FROM图像,但似乎没有 API。
  3. 为什么无法使用ADD file:<HASH> in /语法构建 dockerfile?有什么方法可以使用这种语法构建图像,或者在两种格式之间进行转换?

标签: dockerdockerfiledocker-containerdockerhubdocker-image

解决方案


Docker Hub 历史视图不显示实际的 Dockerfile;相反,它显示了基本上从docker history图像中提取的内容。这不会保留您正在寻找的具体细节:它不记得基本图像的名称,或者被ADD编辑或COPY编辑的东西的构建上下文文件名。

通过 GitHub 和 Docker Hub 链接,构建了golang:*-busterDockerfileFROM buildpack-deps:...-scmbuildpack-deps:buster-scmFROM buildpack-deps:buster-curl就是FROM debian:buster;并且有一个非常简单的 Dockerfile(在此全文引用):

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

FROM scratch从一个完全空的图像开始;那是 Docker 镜像树的基础(以及告诉docker history和类似工具停止的内容)。该ADD行解压缩 Debian 系统映像的 tar 文件。

如果您查看docker history或引用您引用的 Docker Hub 历史视图,您应该能够看到这些相同的步骤正在发生。ADD file:4b0... in /对应于,第二ADD rootfs.tar.gz /行是CMD ["bash"]。它不被 Dockerfile 或图像分割,并且ADD不保存原始文件名。(如果没有.rootfs.tar.gz

ADD file:hash in /path语法不是标准的 Dockerfile 语法(特别是这个词不是in它的一部分)。我不确定是否有可靠的方法可以将主机文件或 URL 转换为哈希,但是构建图像并查看它docker history会告诉您(假设您已经与文件元数据完美匹配)。没有办法恢复到原始文件名或语法,也绝对没有办法恢复到文件内容。


推荐阅读