Docker 并不总是创建中间容器

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

这个问题是为了演示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
intermediate container a678c817e467
从哪里来

结果

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

因此,对于添加和复制,说明导致创建中间容器,然后将其删除。

对于步骤2/3,不需要旋转中间容器。Docker将在不启动临时容器的情况下将文件
node.js
添加到图像层

此构建遵循以下步骤:

  • 下载图像,创建图层ID
    d9aed20b68a4
  • 添加
    node.js
    以创建图像层ID
    44c4486c7b32
  • 从图像ID
    44c4486c7b32
    启动容器
    c9291d1209b0
    ,并设置入口点
  • 将步骤(3)的结果保存为最终图像层ID
    cfb9beed3592
  • 如果在dockerfile中使用
    副本
    ,而不是
    添加
    ,您将看到同样的情况
    COPY
    通常是将文件移动到图像中的首选命令,但是
    ADD
    也可以(只是不要
    ADD
    URL,因为不鼓励这种模式)


    编辑
    更新中包含的链接来自2016年。当时,Docker使用一个特殊的“助手映像”,在容器内部运行一个自定义二进制文件,以便执行
    COPY/ADD
    指令。最近(2019年4月)对其进行了更改,以允许构建直接操作文件系统。更多信息可在中找到,但我将在此处添加相关部分:

    FileOp
    LLB支持新操作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