Saltar al contenido
QuenchWorks

Construir una aplicación .NET

Una aplicación .NET publicada no necesita el SDK en tiempo de ejecución, solo el runtime correspondiente. Así que ejecuta dotnet publish en la etapa de construcción con la imagen del SDK, y luego ejecuta la salida publicada sobre la base de runtime ligera: aspnet para aplicaciones web y APIs, dotnet-runtime para aplicaciones de consola y de worker. El SDK y la caché de NuGet se quedan atrás en la etapa de construcción.

Estas construyen sobre ghcr.io/quenchworks/images/dotnet:10 (el SDK), y luego se ejecutan sobre ghcr.io/quenchworks/images/aspnet:10 o ghcr.io/quenchworks/images/dotnet-runtime:10. Mantén la línea del runtime acorde con el SDK con el que construiste.

El Dockerfile multi-etapa

# Build stage: restore, then publish the app.
FROM ghcr.io/quenchworks/images/dotnet:10 AS build
WORKDIR /src
# Restore first so the layer caches when only code changes.
COPY ["App.csproj", "./"]
RUN ["dotnet", "restore", "App.csproj"]
COPY . .
RUN ["dotnet", "publish", "App.csproj", "-c", "Release", "-o", "/app/publish", "--no-restore"]
# Runtime stage: ASP.NET Core runtime, nonroot.
FROM ghcr.io/quenchworks/images/aspnet:10 AS runtime
WORKDIR /app
ENV ASPNETCORE_URLS=http://+:8080
COPY --from=build /app/publish ./
USER 1001
EXPOSE 8080
ENTRYPOINT ["dotnet", "App.dll"]
# Build stage: restore, then publish the worker/console app.
FROM ghcr.io/quenchworks/images/dotnet:10 AS build
WORKDIR /src
COPY ["Worker.csproj", "./"]
RUN ["dotnet", "restore", "Worker.csproj"]
COPY . .
RUN ["dotnet", "publish", "Worker.csproj", "-c", "Release", "-o", "/app/publish", "--no-restore"]
# Runtime stage: the plain .NET runtime, no ASP.NET Core stack.
FROM ghcr.io/quenchworks/images/dotnet-runtime:10 AS runtime
WORKDIR /app
COPY --from=build /app/publish ./
USER 1001
ENTRYPOINT ["dotnet", "Worker.dll"]

Qué hace cada etapa

  1. Construcción. La imagen dotnet es el SDK completo. Restaura antes de copiar el resto del código fuente para que esa capa se cachee, y luego ejecuta dotnet publish en Release a una carpeta fija. El SDK, la caché de NuGet y el código fuente se quedan en esta etapa.
  2. Runtime. Empieza desde aspnet (para web) o dotnet-runtime (para consola), copia la salida de publish, baja a uid 1001 y ejecuta el ensamblado de entrada. No se entrega ningún SDK.

Siguiente

  • Para la huella más pequeña, publica una aplicación autocontenida y recortada y ejecútala sobre una base de runtime, o compila por AOT una aplicación de consola a un binario nativo y entrégala sobre static.
  • Fija por digest para que cada construcción ejecute exactamente la base que se escaneó y firmó.