# ----------------------------- # Runtime base # ----------------------------- FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base ENV APP_UID=$APP_UID WORKDIR /app EXPOSE 8080 # ----------------------------- # Build stage # ----------------------------- FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["RackPeek.Web/RackPeek.Web.csproj", "RackPeek.Web/"] COPY ["RackPeek.Domain/RackPeek.Domain.csproj", "RackPeek.Domain/"] COPY ["Shared.Rcl/Shared.Rcl.csproj", "Shared.Rcl/"] COPY ["RackPeek/RackPeek.csproj", "RackPeek/"] RUN dotnet restore "RackPeek.Web/RackPeek.Web.csproj" COPY . . # Publish Web WORKDIR "/src/RackPeek.Web" RUN dotnet publish "./RackPeek.Web.csproj" -c $BUILD_CONFIGURATION -o /app/web-publish /p:UseAppHost=false # Publish CLI WORKDIR "/src/RackPeek" RUN dotnet publish "./RackPeek.csproj" -c $BUILD_CONFIGURATION -o /app/cli-publish /p:UseAppHost=false # ----------------------------- # Final runtime image # ----------------------------- FROM base AS final WORKDIR /app USER root # Create shared config directory safely RUN mkdir -p /app/config \ && chown -R ${APP_UID}:0 /app/config \ && chmod -R g=u /app/config VOLUME ["/app/config"] # Copy published outputs COPY --from=build /app/web-publish . COPY --from=build /app/cli-publish /usr/local/bin/rpk-dir # Create CLI wrapper RUN if [ -f /usr/local/bin/rpk-dir/RackPeek ]; then \ mv /usr/local/bin/rpk-dir/RackPeek /usr/local/bin/rpk; \ else \ echo '#!/bin/sh\nexec dotnet /usr/local/bin/rpk-dir/RackPeek.dll "$@"' > /usr/local/bin/rpk && \ chmod +x /usr/local/bin/rpk; \ fi # Make sure ASP.NET binds correctly in containers ENV ASPNETCORE_URLS=http://+:8080 ENV RPK_YAML_DIR=/app/config # Drop privileges USER ${APP_UID} ENTRYPOINT ["dotnet", "RackPeek.Web.dll"]