gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:12:29 27 4
gpt4 key购买 nike

我看到一个 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/

关于docker - dockerfile 中复制命令中使用的 --from 是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66353510/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com