copy - 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”
解决方案
的输出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>
部分似乎是在copyInfoForFile
Docker 的复制模块的功能中添加的。
如果您将该输出复制到 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 命令的准确记录。
推荐阅读
- google-sheets - 从 Google 表格中的数字中删除尾随“.00”
- javascript - 使用 JavaScript 在 HTML 中插入上次更新日期
- java - CreateMaturityDate() 上的 NullPointerException
- javascript - 错误 TS2339:“用户 | 类型”上不存在属性“管理员” 不明确的'
- azure - Terraform 应用服务不会连接到存储帐户
- python - 将 Pytest 作为子进程调用
- vb.net - 根据另一个datagridview检查值填充datagridview vb.net
- angular - Angular Service Worker 每次(软)重新加载(Chrome)时都会获取所有文件
- python - 如何从列表中删除一个元素
- node.js - 如何在 mern 应用上显示错误消息