Docker 是否在多阶段构建期间由每个RUN命令创建运行容器?

Docker 是否在多阶段构建期间由每个RUN命令创建运行容器?,docker,Docker,我是Docker的新手,如果我的问题听起来很愚蠢,对不起。 以下是教科书中的dockerfile: FROM diamol/base AS build-stage RUN echo 'Building...' > /build.txt #line 2 FROM diamol/base AS test-stage COPY --from=build-stage /build.txt /build.txt RUN echo 'Te

我是Docker的新手,如果我的问题听起来很愚蠢,对不起。 以下是教科书中的dockerfile:

FROM diamol/base AS build-stage                  
RUN echo 'Building...' > /build.txt              #line 2

FROM diamol/base AS test-stage
COPY --from=build-stage /build.txt /build.txt
RUN echo 'Testing...' >> /build.txt              #line 6

FROM diamol/base
COPY --from=test-stage /build.txt /build.txt
CMD cat /build.txt
作者说:

在构建过程中,RUN指令在容器内执行一个命令,该命令的任何输出都保存在图像层中。

我的问题是:

Q1由于作者提到的RUN指令在构建期间在容器中执行命令,这是否意味着在第2行的第一个RUN命令中,根据
diamol/base
图像创建了一个contianer,这个容器修改文件的内容,然后将更改提交回
diamol/base
image?第6行也发生了同样的事情,我的理解正确吗


Q2如果我的理解是正确的,我们不是有三个不同的diamol/base图像-原始的一个和两个在构建阶段和测试阶段修改的图像,它不是非常低效,因为它只是一个小文件(假设其大小为3kb),内部是不同的,虽然图像可能大到500MB,并且我们有3个副本,即500MB*3=1.5G?

Q1,但基本图像使用diamol/base的
保持不变,每次都从原始图像重新启动。前面的图像由
--from=build stage
使用。对于构建中的每个步骤,都会创建一个层,可以重用该层以加快以后的构建

Q2图像由层组成,层在图像之间重用。可能会有一点开销,但空间不会重复。图像是不可变的,基于图像的容器包含更改

Docker图像由一系列层构建而成。每一层代表图像Dockerfile中的一条指令。除最后一层外,每一层都是只读的


Q1使用diamol/base中的
基本映像保持不变,每次从原始映像重新启动。前面的图像由
--from=build stage
使用。对于构建中的每个步骤,都会创建一个层,可以重用该层以加快以后的构建

Q2图像由层组成,层在图像之间重用。可能会有一点开销,但空间不会重复。图像是不可变的,基于图像的容器包含更改

Docker图像由一系列层构建而成。每一层代表图像Dockerfile中的一条指令。除最后一层外,每一层都是只读的


docker build
实际上就像一系列
docker run
然后
docker commit
步骤:它为每个
run
行启动一个新容器,并根据每个
行的结果创建一个新图像。但是:

问题1。图像不一定有名称,并且名称不会指向新图像,除非您明确告诉Docker(
Docker tag
Docker build-t
)。如果您
docker-build
显示并运行
docker-images
,您应该会看到未修改的
diamol/base
图像,中间构建阶段的两个
图像,以及您构建的最终图像


问题2。当您看到对图像层的引用时,它是一个仅包含来自上一个图像的更改的块。例如,
buildstage
映像表示为对
diamol/base
映像的引用(不是副本,只是它的映像ID),加上一个仅包含12字节
/build.txt
文件的文件系统<代码>docker history
可以显示其中一些详细信息。即使基本映像相当大,您也只能在最终映像之间共享它的一个副本。

docker build
实际上就像一系列
docker run
然后
docker commit
步骤:它为每个
run
行启动一个新容器,并根据每个行的结果创建一个新映像。但是:

问题1。图像不一定有名称,并且名称不会指向新图像,除非您明确告诉Docker(
Docker tag
Docker build-t
)。如果您
docker-build
显示并运行
docker-images
,您应该会看到未修改的
diamol/base
图像,中间构建阶段的两个
图像,以及您构建的最终图像


问题2。当您看到对图像层的引用时,它是一个仅包含来自上一个图像的更改的块。例如,
buildstage
映像表示为对
diamol/base
映像的引用(不是副本,只是它的映像ID),加上一个仅包含12字节
/build.txt
文件的文件系统<代码>docker history
可以显示其中一些详细信息。即使基础映像相当大,您也只能在最终映像之间共享一个副本。

因此在多级生成期间没有创建和运行容器?抱歉,仍然有点困惑,您的意思是有一个中间映像要进行更改,而此中间映像只包含修改后的文件吗?这个中间图像是容器层?我更新了我的答案,它们是层而不是图像。在链接中,您可以解释它是如何工作的。图像由只读层组成。最后一层是R/W,这是容器的层(容器层)。因此在多阶段构建期间没有创建和运行容器?很抱歉,仍然有点困惑,您的意思是有一个中间映像要进行更改,而这个中间映像只包含修改过的文件吗?这个中间图像是容器层?我更新了我的答案,它们是层而不是图像。在链接中,您可以解释它是如何工作的。图像由只读层组成。最后一层是R/W,这是容器层(容器层)。谢谢你的回答。你的意思是每次运行