多阶段构建中的最终输出图像是什么?

时间:2020-08-25 12:36:04

标签: docker

下面是创建映像的dockerfile:

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

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

FROM diamol/base
COPY --from=test-stage /build.txt /build.txt
RUN echo 'Done...' >> /build.txt               

我的理解是,最终的图像由diamol /碱层和最后一个RUN命令之后创建的层组成,如下图所示: enter image description here

我的理解正确吗?

2 个答案:

答案 0 :(得分:2)

该图是正确的,因为多阶段构建的每个步骤都建立在diamol/base之上。 在每个步骤中,build.txt文件将被复制并修改。您可以通过运行最终映像(例如foo)中的容器来验证文件的内容:

$ docker build -t foo .
$ docker run --rm -it --entrypoint=cat foo build.txt
Building...
Testing...
Done...

答案 1 :(得分:0)

RUNCOPYADD创建图层,因此从技术上讲,您有3个图层:

  • 初始diamol/base
  • 顶层,其中包含复制的build.txt
  • 以及将完成内容附加到文本文件的最后一层。

您可以自己检查图像以检查在构建过程中创建的图层:

docker inspect <image-ID> --format '{{json .RootFS.Layers}}' | python -m json.tool

两个中间阶段确实创建了自己的图像,您可以在docker image ls中看到它们,它们没有名称和标签<none>:<none>