为什么在 VisualStudio 为 .NET Core 自动生成的 dockerfile 中发布之前需要恢复和构建

hcp*_*hcp 8 c# visual-studio docker .net-core asp.net-core

VisualStudio 为 .NET Core 生成 Dockerfile,如下所示:

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

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

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

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Sandbox.dll"]
Run Code Online (Sandbox Code Playgroud)

SDK 分为三个不同的步骤:

  • 恢复
  • 建造
  • 发布

看起来它可以简化为一个publish阶段并得到如下所示的结果:

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

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS publish
WORKDIR /src
COPY . .
RUN dotnet publish "src/Sandbox/Sandbox.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Sandbox.dll"]
Run Code Online (Sandbox Code Playgroud)

这种步骤分离是否是必要的,以便将来更容易自定义每个步骤,或者是否有其他原因这样做?

Oma*_*jid 6

看起来他们正在尝试通过使用 docker 缓存和分层来优化事物。

将恢复与构建/发布分开是一个好主意。您的代码经常更改,但项目文件和依赖项变化很少。Docker 对不会改变的东西使用缓存。如果您可以将项目文件与其余代码分开,则可以缓存“恢复”操作并使将来的构建速度更快。

有关其工作原理的更多信息,请参阅docker 文档中的构建缓存。

另请看一下:https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/docker/building-net-docker-images ?view=aspnetcore-5.0#the-dockerfile

我不确定这会给你带来什么:

RUN dotnet build "Sandbox.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Sandbox.csproj" -c Release -o /app/publish
Run Code Online (Sandbox Code Playgroud)

我觉得发布可以合并到前一阶段。我肯定错过了什么。

编辑:进一步思考,也许这可以让您在自定义发布方式时(再次!)使用缓存?

例如,如果您想以独立模式发布,或者以不同的运行时 ID 为目标,则只需更改发布命令而不是构建命令。如果您的应用程序很大,这可能会节省您一些时间。