71 lines
2.6 KiB
Docker
71 lines
2.6 KiB
Docker
# ------------------------------------------------------------------------------
|
|
# Stage 1: Builder
|
|
# This stage builds the application and its dependencies.
|
|
# ------------------------------------------------------------------------------
|
|
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS builder
|
|
|
|
WORKDIR /src
|
|
|
|
# Restore dependencies
|
|
COPY src/Dotnet.Samples.AspNetCore.WebApi/*.csproj ./Dotnet.Samples.AspNetCore.WebApi/
|
|
RUN dotnet restore ./Dotnet.Samples.AspNetCore.WebApi
|
|
|
|
COPY src/Dotnet.Samples.AspNetCore.WebApi/ ./Dotnet.Samples.AspNetCore.WebApi/
|
|
|
|
WORKDIR /src/Dotnet.Samples.AspNetCore.WebApi
|
|
|
|
# Build solution and publish release
|
|
RUN dotnet publish -c Release -o /app/publish
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Stage 2: Runtime
|
|
# This stage creates the final, minimal image to run the application.
|
|
# ------------------------------------------------------------------------------
|
|
FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine AS runtime
|
|
|
|
WORKDIR /app
|
|
|
|
# Install curl for health check
|
|
RUN apk add --no-cache curl
|
|
|
|
# Metadata labels for the image. These are useful for registries and inspection.
|
|
LABEL org.opencontainers.image.title="🧪 Web API made with .NET 10 (LTS) and ASP.NET Core"
|
|
LABEL org.opencontainers.image.description="Proof of Concept for a Web API made with .NET 10 (LTS) and ASP.NET Core"
|
|
LABEL org.opencontainers.image.licenses="MIT"
|
|
LABEL org.opencontainers.image.source="https://github.com/nanotaboada/Dotnet.Samples.AspNetCore.WebApi"
|
|
|
|
# Set environment variables
|
|
ENV ASPNETCORE_URLS=http://+:9000
|
|
ENV ASPNETCORE_ENVIRONMENT=Production
|
|
# Alpine images default to invariant globalization mode. Explicitly opt in since
|
|
# this API uses ISO-8601 dates and ASCII data — ICU is not required.
|
|
ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=true
|
|
|
|
# Copy published app from builder
|
|
COPY --from=builder /app/publish/ .
|
|
|
|
# Copy metadata docs for container registries (e.g.: GitHub Container Registry)
|
|
COPY --chmod=444 README.md ./
|
|
|
|
# https://rules.sonarsource.com/docker/RSPEC-6504/
|
|
|
|
# Copy entrypoint and healthcheck scripts
|
|
COPY --chmod=555 scripts/entrypoint.sh ./entrypoint.sh
|
|
COPY --chmod=555 scripts/healthcheck.sh ./healthcheck.sh
|
|
|
|
# Add non-root user and make volume mount point writable
|
|
RUN addgroup -S aspnetcore && \
|
|
adduser -S -G aspnetcore aspnetcore && \
|
|
mkdir -p /storage && \
|
|
chown aspnetcore:aspnetcore /storage
|
|
|
|
USER aspnetcore
|
|
|
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=5s --retries=3 \
|
|
CMD ["./healthcheck.sh"]
|
|
|
|
EXPOSE 9000
|
|
|
|
ENTRYPOINT ["./entrypoint.sh"]
|
|
CMD ["dotnet", "Dotnet.Samples.AspNetCore.WebApi.dll"]
|