Docker 镜像层:`ADD file:<some_hash> in /` 是什么意思?

Ben*_*han 8 docker dockerhub dockerfile docker-image docker-container

在 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 ?有什么方法可以使用这种语法构建图像,或者在两种格式之间进行转换?

Dav*_*aze 7

Docker Hub 历史视图没有显示实际的 Dockerfile;相反,它显示了基本上从docker history图像中提取的内容。这不会保留您正在寻找的特定细节:它不会记住基本图像的名称,或者被ADDed 或COPYed 输入的事物的构建上下文文件名。

通过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"]
Run Code Online (Sandbox Code Playgroud)

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

如果您docker history查看引用的 Docker Hub 历史视图或 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会告诉你(假设你已经完美匹配文件元数据)。无法返回原始文件名或语法,也绝对无法返回文件内容。