Dockerfile 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. # -----------------------------
  2. # Runtime base
  3. # -----------------------------
  4. FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base
  5. ARG APP_UID=1000
  6. ENV APP_UID=$APP_UID
  7. WORKDIR /app
  8. EXPOSE 8080
  9. # -----------------------------
  10. # Build stage
  11. # -----------------------------
  12. FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
  13. ARG BUILD_CONFIGURATION=Release
  14. WORKDIR /src
  15. COPY ["RackPeek.Web/RackPeek.Web.csproj", "RackPeek.Web/"]
  16. COPY ["RackPeek.Domain/RackPeek.Domain.csproj", "RackPeek.Domain/"]
  17. COPY ["Shared.Rcl/Shared.Rcl.csproj", "Shared.Rcl/"]
  18. COPY ["RackPeek/RackPeek.csproj", "RackPeek/"]
  19. RUN dotnet restore "RackPeek.Web/RackPeek.Web.csproj"
  20. COPY . .
  21. # Publish Web
  22. WORKDIR "/src/RackPeek.Web"
  23. RUN dotnet publish "./RackPeek.Web.csproj" -c $BUILD_CONFIGURATION -o /app/web-publish /p:UseAppHost=false
  24. # Publish CLI
  25. WORKDIR "/src/RackPeek"
  26. RUN dotnet publish "./RackPeek.csproj" -c $BUILD_CONFIGURATION -o /app/cli-publish /p:UseAppHost=false
  27. # -----------------------------
  28. # Final runtime image
  29. # -----------------------------
  30. FROM base AS final
  31. WORKDIR /app
  32. USER root
  33. # Create shared config directory safely
  34. RUN mkdir -p /app/config \
  35. && chown -R ${APP_UID}:0 /app/config \
  36. && chmod -R g=u /app/config
  37. VOLUME ["/app/config"]
  38. # Copy published outputs
  39. COPY --from=build /app/web-publish .
  40. COPY --from=build /app/cli-publish /usr/local/bin/rpk-dir
  41. # Create CLI wrapper
  42. RUN if [ -f /usr/local/bin/rpk-dir/RackPeek ]; then \
  43. mv /usr/local/bin/rpk-dir/RackPeek /usr/local/bin/rpk; \
  44. else \
  45. echo '#!/bin/sh\nexec dotnet /usr/local/bin/rpk-dir/RackPeek.dll "$@"' > /usr/local/bin/rpk && \
  46. chmod +x /usr/local/bin/rpk; \
  47. fi
  48. # Make sure ASP.NET binds correctly in containers
  49. ENV ASPNETCORE_URLS=http://+:8080
  50. ENV RPK_YAML_DIR=/app/config
  51. # Drop privileges
  52. USER ${APP_UID}
  53. ENTRYPOINT ["dotnet", "RackPeek.Web.dll"]