Docker 并不总是创建中间容器
这个问题是为了演示docker及其工作原理,下面是dockerfile的内容Docker 并不总是创建中间容器,docker,dockerfile,Docker,Dockerfile,这个问题是为了演示docker及其工作原理,下面是dockerfile的内容 FROM node:7 ADD node.js /node.js ENTRYPOINT ["node", "node.js"] 并且node.js文件存在于同一目录中,问题是为什么没有为步骤2创建中间容器 编辑 例如,请参见下面的示例,其中COPY导致创建中间容器 Step 4 : COPY package.json /usr/src/app/ ---> 334d93a151ee Removing inter
FROM node:7
ADD node.js /node.js
ENTRYPOINT ["node", "node.js"]
并且node.js文件存在于同一目录中,问题是为什么没有为步骤2创建中间容器
编辑
例如,请参见下面的示例,其中COPY导致创建中间容器
Step 4 : COPY package.json /usr/src/app/ ---> 334d93a151ee Removing
intermediate container a678c817e467
从哪里来
结果
Step 4/5 : ADD Execute-MyCmdlet.ps1 c:\example\ ---> a955b2621c31
Removing intermediate container b825593d39fc
因此,对于添加和复制,说明导致创建中间容器,然后将其删除。对于步骤2/3,不需要旋转中间容器。Docker将在不启动临时容器的情况下将文件
node.js
添加到图像层
此构建遵循以下步骤:
d9aed20b68a4
node.js
以创建图像层ID44c4486c7b32
44c4486c7b32
启动容器c9291d1209b0
,并设置入口点cfb9beed3592
副本
,而不是添加
,您将看到同样的情况COPY
通常是将文件移动到图像中的首选命令,但是ADD
也可以(只是不要ADD
URL,因为不鼓励这种模式)
编辑:
更新中包含的链接来自2016年。当时,Docker使用一个特殊的“助手映像”,在容器内部运行一个自定义二进制文件,以便执行
COPY/ADD
指令。最近(2019年4月)对其进行了更改,以允许构建直接操作文件系统。更多信息可在中找到,但我将在此处添加相关部分:
FileOpLLB支持新操作FileOp,允许在生成期间执行内置文件操作,如复制文件、创建新文件或目录以及删除文件。以前的ADD/COPY命令使用在容器中运行自定义二进制文件的助手图像,现在这些命令直接使用FileOp。这允许在空气间隙环境中更好地执行和使用这些命令,而无需预加载辅助映像,也可以修复辅助映像实现中报告的问题
OP应该更具体地阅读
ADD或COPY
一段,其中规定首选COPY
,除非您特别需要ADD
@Zeitounator提供的功能,这不是什么最佳实践,而是为什么没有创建中间容器。请看更新。我想我知道你的问题是什么了。我更新了我的答案,加入了对你所看到的东西的解释。我认为导致这一变化的变化于2019年4月发布。您发布的第一个链接是2016年发布的,官方文档中的示例输出至少自2017年以来没有更改。我想这对大多数人来说是一个无关紧要的差别,所以更新文档可能没有多大的紧迫性:)
ADD Execute-MyCmdlet.ps1 c:\example\
Step 4/5 : ADD Execute-MyCmdlet.ps1 c:\example\ ---> a955b2621c31
Removing intermediate container b825593d39fc