【发布时间】:2019-10-29 13:22:11
【问题描述】:
在我看来,为 Web .net 核心应用程序自动生成的 Dockerfile 太大了,但为什么呢?为什么微软决定这样创建它?
这是我们在创建应用程序期间添加标志“添加 docker 支持”时自动生成的 Dockerfile:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
WORKDIR /src
COPY ["app/app.csproj", "app/"]
RUN dotnet restore "app/app.csproj"
COPY . .
WORKDIR "/src/app"
RUN dotnet build "app.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "app.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "app.dll"]
在我看来,它可以是这样的:
FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster as build
WORKDIR /src
COPY ["app/app.csproj", "app/"]
RUN dotnet restore "app/app.csproj"
COPY . .
WORKDIR "/src/app"
RUN dotnet build "app.csproj" -c Release -o /app/build
RUN dotnet publish "app.csproj" -c Release -o /app/publish
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim
WORKDIR /app
EXPOSE 80
EXPOSE 443
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "app.dll"]
为什么微软决定首先 - 获取 aspnet:3.0-buster-slim 只是为了公开端口并稍后将它们用作最终版本?就像我的示例中那样,将这个图像作为最后一步得到它会短得多。我们还需要为 sdk:3.0-buster 使用 double From 吗(第一个命名为 build,第二个命名为 publish)?就像我的例子一样,可以一个一个地添加多个 RUN。
也许有一些技术建议为什么他们决定这样做? 谢谢!
【问题讨论】:
-
Dockerfile 中的第一个图像是 VS 用于调试的图像(按照惯例,有一个设置可以覆盖它并使用 VS 2019 中的特定命名阶段)。显然,您希望为此尽可能缩短周转时间。
标签: docker asp.net-core .net-core dockerfile