6

当您在 ASP.NET Core 站点上的 Visual Studio 中单击“添加 Docker 支持”时,这是默认的多阶段 Dockerfile。

FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY WebApplication1.sln ./
COPY WebApplication1/WebApplication1.csproj WebApplication1/
RUN dotnet restore
COPY . .
WORKDIR /src/WebApplication1
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

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

为什么他们选择使用四个阶段,以阶段开始和结束basepublish另外,为什么要使用相同的build基础图像创建舞台。为什么 Dockerfile 不是这样分三个阶段的:

FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY WebApplication1.sln ./
COPY WebApplication1/WebApplication1.csproj WebApplication1/
RUN dotnet restore
COPY . .
WORKDIR /src/WebApplication1
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

FROM microsoft/aspnetcore:2.0 AS final
WORKDIR /app
EXPOSE 80
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "WebApplication1.dll"]

我错过了一些优势吗?

4

2 回答 2

2

该文件实际上等同于以下

FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY WebApplication1.sln ./
COPY WebApplication1/WebApplication1.csproj WebApplication1/
RUN dotnet restore
COPY . .
WORKDIR /src/WebApplication1
RUN dotnet build -c Release -o /app
RUN dotnet publish -c Release -o /app

FROM microsoft/aspnetcore:2.0 AS base
EXPOSE 80
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "WebApplication1.dll"]

现在他们可能选择 4 构建阶段的原因可能是两者中的任何一个

  • 表现性的
  • 未来的变化

所以它可能描绘了一个

base -> build -> publish -> deploy the build

具有 2 个构建阶段的大小也与这个相同。所以2阶段和4阶段没有明显区别。它成为一种事物的偏好、代表和一切。技术上没有什么不同

于 2018-05-02T10:18:59.673 回答
1

使用 4 个阶段没有程序上的原因。

在第一阶段,只是改变了配置。在第三阶段,图像没有改变。的唯一用途是FROM build AS publish拥有一个新的别名。

我认为在 docker 的构建结构中处理以后的更改是没有用的。(4 阶段代码可能会这样做。)使用版本化图像,就像在您的示例中一样。例如2.0,而不是latest. 这样可以避免不兼容。如果构建的方式会有变化,你可以赶上它。

docker建议在没有指定 csproj 名称的情况下工作,如使用*.csproj. 这适用于大多数项目,产生大约 350MB 的图像大小。

于 2018-05-02T11:47:29.873 回答