【问题标题】:Why does docker create containers while building images?为什么 docker 在构建镜像时会创建容器?
【发布时间】:2020-01-17 21:04:19
【问题描述】:

为什么 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 有什么意义?

注意这一行Removing intermediate container f8adb5dc5a47

【问题讨论】:

    标签: docker dockerfile


    【解决方案1】:

    对于每一行,守护进程都会创建一个新图像,并且每条指令都独立运行。 Docker Daemon 使用中间镜像来加速 docker 构建过程。构建缓存表明了这一点。

    【讨论】:

    • 我已经知道那个 Sanket。如果你仔细观察,你会看到它在构建过程中运行容器。
    【解决方案2】:

    考虑如何在不使用现有 docker 映像的Dockerfile 的情况下创建映像。您将从图像创建一个容器,在容器内做一些事情,然后 commit 创建新图像的容器。

    这就是docker build 正在做的事情。它从上一层创建一个容器(FROM 是第一条指令的上一层),在容器内运行当前指令并将这个修改后的容器提交为新的镜像层。

    【讨论】:

    • WORKDIR 基本上是一张光盘。如果你 cd 在一个容器内,你真正的承诺是什么?一旦你杀死了容器,你通过改变容器内的目录真正实现了什么?
    • WORKDIR 不仅仅是 cd。如果目录不存在,则会创建它
    • 我知道,就我而言,它存在。另外,在容器中创建目录并杀死它有什么意义?
    • 带有额外目录的图像与没有它的图像不同。 WORKDIR 就像 Dockerfile 中的任何其他指令一样。为什么您需要一个容器来执行它并保存生成的图像,这让您感到惊讶?保存图像后,不再需要容器,因此将其杀死。
    • docker 还存储有关每个图像的元数据,此元数据包括工作目录。您可以使用docker image inspect <image> 查看元数据。尝试识别由 WORKDIR 指令创建的图像并在其上运行docker image inspect。您会看到 docker 知道该映像的工作目录。因此,当为上一个图像的下一条指令创建容器时(在您的问题中复制),docker 知道它必须复制到哪个工作目录。
    猜你喜欢
    • 2016-08-16
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 2014-05-07
    • 2020-03-10
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多