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/