# ── Stage 1: Build ────────────────────────────────────────── FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build WORKDIR /src # Copy csproj first for layer caching — restores before copying source COPY Extrudex.csproj . RUN dotnet restore # Copy the rest of the source COPY . . RUN dotnet publish Extrudex.csproj \ -c Release \ -o /app/publish \ --no-restore # ── Stage 2: Runtime ──────────────────────────────────────── FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime WORKDIR /app # Install curl for health check (not included in aspnet base image) RUN apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/* # Non-root user for security RUN adduser --disabled-password --gecos "" appuser USER appuser # Copy published output from build stage COPY --from=build /app/publish . # ASP.NET Core listens on 8080 by default in .NET 8+ EXPOSE 8080 # Health check against /health endpoint HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ CMD curl --fail http://localhost:8080/health || exit 1 ENTRYPOINT ["dotnet", "Extrudex.dll"]