【问题标题】:Multiple queries regarding Docker Multi Stage Build process关于 Docker 多阶段构建过程的多个查询
【发布时间】:2026-02-07 21:25:01
【问题描述】:

我是 Docker 的新手,对一些事情感到困惑。我也有一些疑问。请在下面找到它们。如果这些问题得到解决,我会很高兴。

问题 1: 在多阶段构建中,docker如何识别阶段的工件?因为我在很多文章中看到,人们说COPY --from=0 src dest 将复制上一个构建阶段的工件。我的意思是我们在哪里明确定义您需要从该文件夹中复制工件?舞台的build output/build artifact是什么定义的?

# Stage 1
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /build
COPY . .
RUN dotnet restore
RUN dotnet publish -c Release -o /app

# Stage 2
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS final
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "Core3Api.dll"]
  • Q2 - COPY --from=build src dest 是否从以前的版本或映像中复制文件?
  • Q3 - 通常copy有两个参数,一个是源,一个是 另一个是目的地。上面我们有三个参数, --from=buildsrcdest。这个副本是如何工作的?
  • Q4 - 我们需要在每个构建阶段设置WORKDIR 吗?因为我 认为每个构建阶段都在一个新的隔离上下文中执行?或者它 使用相同的上下文?
  • Q5 - 当 Docker 移动到之前构建的镜像时,它存储在哪里 下一阶段?

我所有的问题都是相互关联的,这就是我将所有问题合二为一的原因。

【问题讨论】:

    标签: docker docker-compose dockerfile containers devops


    【解决方案1】:

    Docker 构建图像;每个图像都由一个文件系统和一些额外的元数据组成。在多阶段构建(Q5)的上下文中,每个FROM 行都会启动一个新的镜像构建,这些镜像构建的结果是完全正常的镜像;您可以在docker images 输出中看到它们(可能带有<none> 名称)。同样,因为每个构建阶段都在FROM 之前的某个图像的上下文中添加星标,(Q4)您确实需要在每个重要的阶段重复WORKDIR(但由于每个阶段都处于独立的构建上下文中,因此不同的阶段不需要)不一定需要相同的工作目录)。

    Dockerfile COPY 命令 (Q3) 可以采用选项,就像在普通 shell 中 cp -r from to 一样。 --from 选项(Q2)命名图像;它可以是同一 Dockerfile 中的早期构建阶段FROM ... AS name,也可以是任意其他映像。 (Q1) 它从镜像构建的文件系统结果中复制。

    FROM ... AS build
    WORKDIR /build
    RUN ...
    COPY ...
    # An image is created that's effectively a snapshot here
    
    FROM ...
    WORKDIR /app
    COPY src dest                       # from the build context
    COPY --from=build /build/dir dest2  # from the "snapshot" point
    COPY --from=0 /build/dir dest3      # from the first image in this Dockerfile
    COPY --from=busybox:latest /bin/busybox dest4  # from another image
    

    【讨论】:

    • 很棒的人..你涵盖了我的所有观点。这个答案肯定会帮助我建立我的 Docker 概念。