Dockerfile 1.8 KB

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