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

Docker image layer: What does `ADD file:<some_hash> in /` mean?

在Docker Hub 图像中有命令列表,每个图像层 为运行。这是一个golang example.

一些应用程序还在 GitHub 中提供了它们的 Docker 文件 。这是一个 golang example.

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

下面是问题:

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

  2. 那是文件,你无法“追踪”它们。

  3. 您不能只复制命令,因为散列不是原始文件。请参阅 https://forums.docker.com/t/how-to-extract-file-from-image/96987 以获取文件。

Docker Hub 历史视图不显示实际的 Docker 文件;相反,它显示的内容基本上是从图像的 docker history 中提取的。这不会保留您正在寻找的具体细节:它不会记住基本图像的名称,或者 ADDed 或 COPY 的东西的 build-context 文件名编入。

通过 GitHub 和 Docker 中心链接,golang:*-buster Dockerfile is built FROM buildpack-deps:...-scm; buildpack-deps:buster-scm is FROM buildpack-deps:buster-curl; that is FROM debian:buster; and that has a very simple Dockerfile(此处全文引用):

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

FROM scratch starts 来自完全空的图像;这是 Docker 图像树的基础(以及告诉 docker history 和类似工具停止的原因)。 ADD 行解压 Debian 系统映像的 tar 文件。

如果您查看 docker history 或您引用的 Docker 集线器历史视图,您应该能够看到这些相同的步骤正在发生。 ADD file:4b0... in /对应ADD rootfs.tar.gz /,第二行是CMD ["bash"]。它不会被 Docker 文件或图像分割,并且不会保存 ADD 中的原始文件名。 (如果没有 rootfs.tar.gzcontents,无论如何你都无法复制图像,所以知道它的文件名只是稍微有点帮助,但不是必需的。)

ADD file:hash in /path 语法不是标准的 Docker 文件语法(单词 in 不是其中的一部分)。我不确定是否有一种可靠的方法可以将主机文件或 URL 转换为散列,但是构建图像并查看其 docker history 会告诉你(假设你有一个完美的匹配用于文件元数据)。无法恢复到原始文件名或语法,也绝对无法恢复到文件内容。