【问题标题】:Docker image layer: What does `ADD file:<some_hash> in /` mean?Docker 镜像层:`ADD file:<some_hash> in /` 是什么意思?
【发布时间】:2020-12-28 14:36:56
【问题描述】:

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

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

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

以下是问题:

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

【问题讨论】:

  • 查看相关的stackoverflow.com/questions/68102407,这里我专门询问ADD file: 之后的哈希实际上是什么的哈希。我相信它需要一个单独的问题,因为它是一个非常具体的细节,与上面的 Q 1. 相关,但没有在其中明确说明。

标签: docker dockerfile docker-container dockerhub docker-image


【解决方案1】:

Docker Hub 历史视图不显示实际的 Dockerfile;相反,它显示的内容基本上是从图像的docker history 中提取的。这不会保留您正在寻找的具体细节:它不记得基本图像的名称,或获得 ADDed 或 COPYed 的事物的构建上下文文件名。

通过 GitHub 和 Docker Hub 链接,golang:*-buster Dockerfile 构建为FROM buildpack-deps:...-scmbuildpack-deps:buster-scmFROM buildpack-deps:buster-curlthatFROM debian:buster;并且有a very simple 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 会告诉您(假设您已完美匹配文件元数据)。无法恢复到原始文件名或语法,也绝对无法恢复文件内容。

【讨论】:

【解决方案2】:
  1. ADDCOPY 表示将文件附加到图像。

  2. 那是文件,你不能“追踪”它们。

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

【讨论】:

    猜你喜欢
    • 2015-09-22
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    相关资源
    最近更新 更多