为什么docker在创建图像时创建容器?

为什么docker在创建图像时创建容器?,docker,dockerfile,Docker,Dockerfile,为什么docker为Dockerfile中的每个命令启动一个容器? 我知道每个命令都会创建一个新层。 Step 1/3 : FROM nginx:latest latest: Pulling from library/nginx 8ec398bc0356: Pull complete dfb2a46f8c2c: Pull complete b65031b6a2a5: Pull complete Digest: sha256:8aa7f6a9585d908a63e5e418dc5d14ae7

为什么docker为Dockerfile中的每个命令启动一个容器? 我知道每个命令都会创建一个新层。

Step 1/3 : FROM nginx:latest
latest: Pulling from library/nginx
8ec398bc0356: Pull complete 
dfb2a46f8c2c: Pull complete 
b65031b6a2a5: Pull complete 
Digest: sha256:8aa7f6a9585d908a63e5e418dc5d14ae7467d2e36e1ab4f0d8f9d059a3d071ce
Status: Downloaded newer image for nginx:latest
 ---> c7460dfcab50
Step 2/3 : WORKDIR /usr/share/nginx/html
 ---> Running in f8adb5dc5a47
Removing intermediate container f8adb5dc5a47
 ---> a59fb35a43c2
Step 3/3 : COPY . .
 ---> 7911d9a451d9
Successfully built 7911d9a451d9
Successfully tagged mynginx:latest
创建一个新的容器并在其中设置WORKDIR的意义何在?当您打算删除该容器时


注意这一行
为每一行后台程序删除中间容器f8adb5dc5a47

将创建一个新映像,并且每条指令独立运行。Docker守护进程使用中间映像来加速Docker构建过程。构建缓存表明了这一点

思考如何在不使用现有docker图像的
Dockerfile
的情况下创建图像。您可以从图像创建一个容器,在容器内执行一些操作,然后创建新图像的容器


这就是docker build的工作。它从上一层创建容器(
from
是第一条指令的上一层),在容器内运行当前指令,并将此修改后的容器作为新图像层提交

我已经意识到了那件事。如果您仔细注意,您将看到它在构建过程中运行容器。WORKDIR基本上是一张cd。如果你把cd放在一个容器里,你到底在做什么?一旦你杀死了容器,通过改变容器中的目录,你真正实现了什么?WORKDIR不仅仅是cd。如果目录不存在,它将被创建。我知道,在我的例子中,它是存在的。还有,在容器中创建一个目录并杀死它的意义是什么?有额外目录的映像与没有额外目录的映像是不同的。WORKDIR与Dockerfile中的任何其他指令一样。为什么需要一个容器来执行并保存生成的图像会让您感到惊讶?保存图像后,不再需要该容器,因此它将被终止。docker还存储关于每个图像的元数据,该元数据包括工作目录。您可以通过
docker image inspect
查看元数据。尝试识别WORKDIR指令创建的图像,并在其上运行
docker image inspect
。您将看到docker知道该图像的工作目录。所以,当为上一个图像中的下一条指令创建容器时(在您的问题中复制),docker知道它必须复制到哪个工作目录。