该问题用于演示docker及其工作原理,以下是dockerfile的内容
FROM node:7
ADD node.js /node.js
ENTRYPOINT ["node", "node.js"]
并且node.js文件存在于同一目录中,问题是为什么没有为步骤2创建中间容器?
~/demos/docker$docker build -t nodeapp .
Sending build context to Docker daemon 3.072kB
Step 1/3 : FROM node:7
7: Pulling from library/node
ad74af05f5a2: Pull complete
2b032b8bbe8b: Pull complete
a9a5b35f6ead: Pull complete
3245b5a1c52c: Pull complete
afa075743392: Pull complete
9fb9f21641cd: Pull complete
3f40ad2666bc: Pull complete
49c0ed396b49: Pull complete
Digest: sha256:af5c2c6ac8bc3fa372ac031ef60c45a285eeba7bce9ee9ed66dad3a01e29ab8d
Status: Downloaded newer image for node:7
---> d9aed20b68a4
Step 2/3 : ADD node.js /node.js
---> 44c4486c7b32
Step 3/3 : ENTRYPOINT ["node", "node.js"]
---> Running in c9291d1209b0
Removing intermediate container c9291d1209b0
---> cfb9beed3592
Successfully built cfb9beed3592
Successfully tagged nodeapp:latest
编辑
例如,请参见this lnk中的以下示例,其中特别是COPY导致创建中间容器的原因
Step 4 : COPY package.json /usr/src/app/ ---> 334d93a151ee Removing
intermediate container a678c817e467
ADD Execute-MyCmdlet.ps1 c:\example\
结果
Step 4/5 : ADD Execute-MyCmdlet.ps1 c:\example\ ---> a955b2621c31
Removing intermediate container b825593d39fc
因此,对于ADD和COPY,指令导致创建中间容器,然后将其删除。
答案 0 :(得分:1)
在步骤2/3中不需要旋转中间容器。 Docker无需启动临时容器即可将文件node.js
添加到图像层。
此构建遵循以下步骤:
d9aed20b68a4
node.js
以创建图像层ID 44c4486c7b32
c9291d1209b0
启动容器44c4486c7b32
并设置入口点cfb9beed3592
如果在dockerfile中使用COPY
而不是ADD
,将会看到相同的内容。通常,COPY
是将文件移入图像的首选命令,但是ADD
也是可以的(只是不要使用ADD
URL,因为不建议使用该模式)。
编辑:
您包含在更新中的链接是从2016年开始的。那时,Docker使用了特殊的“帮助程序映像”,该映像在容器内部运行了自定义二进制文件以执行COPY/ADD
指令。最近(2019年4月)对此进行了更改,以允许该版本直接操纵文件系统。可以在release notes中找到更多信息,但是我将在此处添加相关部分:
FileOp
LLB支持新操作FileOp,允许在构建过程中进行内置文件操作,例如复制文件,创建新文件或目录以及删除文件。以前,ADD / COPY命令使用在容器内运行自定义二进制文件的帮助程序映像,现在这些命令直接使用FileOp。这样可以在无间隙的环境中更好地性能和使用这些命令,而无需预加载帮助程序映像,也可以解决在帮助程序映像实现中报告的问题。