并非总是创建中间容器

时间:2019-10-26 16:28:55

标签: docker dockerfile

该问题用于演示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

this link

ADD Execute-MyCmdlet.ps1 c:\example\

结果

Step 4/5 : ADD Execute-MyCmdlet.ps1 c:\example\  ---> a955b2621c31
Removing intermediate container b825593d39fc

因此,对于ADD和COPY,指令导致创建中间容器,然后将其删除。

1 个答案:

答案 0 :(得分:1)

在步骤2/3中不需要旋转中间容器。 Docker无需启动临时容器即可将文件node.js添加到图像层。

此构建遵循以下步骤:

  1. 下载图像,创建图层ID d9aed20b68a4
  2. 添加node.js以创建图像层ID 44c4486c7b32
  3. 从图像ID c9291d1209b0启动容器44c4486c7b32并设置入口点
  4. 将步骤(3)的结果保存为最终图像层ID cfb9beed3592

如果在dockerfile中使用COPY而不是ADD,将会看到相同的内容。通常,COPY是将文件移入图像的首选命令,但是ADD也是可以的(只是不要使用ADD URL,因为不建议使用该模式)。


编辑
您包含在更新中的链接是从2016年开始的。那时,Docker使用了特殊的“帮助程序映像”,该映像在容器内部运行了自定义二进制文件以执行COPY/ADD指令。最近(2019年4月)对此进行了更改,以允许该版本直接操纵文件系统。可以在release notes中找到更多信息,但是我将在此处添加相关部分:

  

FileOp
  LLB支持新操作FileOp,允许在构建过程中进行内置文件操作,例如复制文件,创建新文件或目录以及删除文件。以前,ADD / COPY命令使用在容器内运行自定义二进制文件的帮助程序映像,现在这些命令直接使用FileOp。这样可以在无间隙的环境中更好地性能和使用这些命令,而无需预加载帮助程序映像,也可以解决在帮助程序映像实现中报告的问题。