dockerfile中复制命令中使用的–from是什么

我看到一个 dockerfile,其代码如下:

FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
WORKDIR /src
COPY ["FirstDockerApp/FirstDockerApp.csproj", "FirstDockerApp/"]
RUN dotnet restore "FirstDockerApp/FirstDockerApp.csproj"
COPY . .
WORKDIR "/src/FirstDockerApp"
RUN dotnet build "FirstDockerApp.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "FirstDockerApp.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "FirstDockerApp.dll"]

在倒数第二行有COPY --from=publish /app/publish .. 我不明白为什么使用 --from 以及它解决了什么目的。你能帮我理解一下吗?

回答

这是一个多阶段构建。这用于保持正在运行的 docker 容器很小,同时仍然能够构建/编译需要大量依赖项的东西。

例如,可以使用以下方法构建 go 应用程序:

FROM golang:1.7.3 AS builder
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html  
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine:latest  
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]  

所以在第一部分我们需要一个完整的 go 环境来编译我们的软件。注意第一部分的名称和别名builder

FROM golang:1.7.3 AS builder

在从第二个 FROM 开始的第二部分中,我们只需要编译的应用程序,不再需要其他 go 依赖项。因此,我们可以将基本映像更改为使用更小的 alpine Linux。但是编译后的文件仍然在我们的构建器镜像中,而不是我们想要启动的镜像的一部分。所以我们需要通过以下方式从构建器镜像中复制文件

COPY --from=builder

您可以根据需要拥有多个阶段。最后一个是定义镜像的镜像,它将成为 docker 容器的模板。

您可以在官方文档中阅读更多相关信息:https :
//docs.docker.com/develop/develop-images/multistage-build/


以上是dockerfile中复制命令中使用的–from是什么的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>