首页 > 解决方案 > dockerfile 复制指令:“in”字是什么意思?

问题描述

在 hello-world Docker 镜像的镜像历史中,有一行:

复制文件:7bf12aab75c3867a023fe3b8bd6d113d43a4fcc415f3cc27cbcf0fff37b65a02 in /

(您还可以在此页面上看到这一行:https ://github.com/docker-library/repo-info/blob/master/repos/hello-world/remote/linux.md )

”这个词是什么意思?我在https://docs.docker.com/engine/reference/builder/#copy中没有看到“in”

标签: copydockerfile

解决方案


的输出docker image history不使用与用于创建它的 Dockerfile 相同的语法。

为了说明,我用 Go 创建了一个静态链接的“Hello, world”程序,以及一个像这样的小 Dockerfile:

FROM scratch
COPY hello /
CMD ["/hello"]

让我们构建 Docker 映像。

$ docker build -t tmp_copy .
Sending build context to Docker daemon  13.15MB
Step 1/3 : FROM scratch
 ---> 
Step 2/3 : COPY hello /
 ---> Using cache
 ---> bfccb234abde
Step 3/3 : CMD ["/hello"]
 ---> Using cache
 ---> 96121e4a4504
Successfully built 96121e4a4504
Successfully tagged tmp_copy:latest

现在我们可以运行它了:

$ docker run tmp_copy
Hello, world.

好的。现在让我们看看没有截断的 Docker 镜像历史输出:

$ docker image history --no-trunc tmp_copy         
IMAGE                                                                     CREATED             CREATED BY                                                                                           SIZE                COMMENT
sha256:96121e4a450418af93dbae993234a62868f0ce504e6884bcdfc6228dcaa3656d   15 minutes ago      /bin/sh -c #(nop)  CMD ["/hello"]                                                                    0B                  
sha256:bfccb234abdec088ccab38822c3e047c5f5e4e410f5db77db7f19a0d8f76c6df   15 minutes ago      /bin/sh -c #(nop) COPY file:ba2740c89a3e5e31ef2669cc67fccde9458c750e1f82bf1181dfe8f5ffdd827d in /    558kB

专栏in /中有我们的好奇心。CREATED BY我们这里有两个图像层,都由它们自己的哈希标识。它们都匹配上述docker build命令输出中截断的哈希值。

我们可以看到,我们在 Dockerfile 中的指令在历史输出中以稍微不同的形式进行了解析和重写。该file:<hash>部分似乎是在copyInfoForFileDocker 的复制模块的功能中添加的。

如果您将该输出复制到 Dockerfile 并尝试运行它,您将得到如下内容:

$ docker build -t tmp_copy2 .
Sending build context to Docker daemon  13.15MB
Step 1/3 : FROM scratch
 ---> 
Step 2/3 : COPY file:ba2740c89a3e5e31ef2669cc67fccde9458c750e1f82bf1181dfe8f5ffdd827d in /
COPY failed: stat /var/lib/docker/tmp/docker-builder853347951/file:ba2740c89a3e5e31ef2669cc67fccde9458c750e1f82bf1181dfe8f5ffdd827d: no such file or directory

那么它是从哪里来的呢?我们可以看到复制命令的“comment”字段的格式字符串包含神秘的in. 然后评论与我们在历史输出中看到的一起存储在该层配置的Cmd字段中。#(nop)

因此,此输出似乎仅供参考,而不是原始 Dockerfile 命令的准确记录。


推荐阅读