Dockerfile 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. # Install curl for the container HEALTHCHECK probe (the aspnet runtime image
  33. # ships without curl/wget, so without this the HEALTHCHECK below cannot run).
  34. RUN apt-get update \
  35. && apt-get install -y --no-install-recommends curl \
  36. && rm -rf /var/lib/apt/lists/*
  37. # Create shared config directory safely
  38. RUN mkdir -p /app/config \
  39. && chown -R ${APP_UID}:0 /app/config \
  40. && chmod -R g=u /app/config
  41. VOLUME ["/app/config"]
  42. # Copy published outputs
  43. COPY --from=build /app/web-publish .
  44. COPY --from=build /app/cli-publish /usr/local/bin/rpk-dir
  45. # Create CLI wrapper
  46. RUN if [ -f /usr/local/bin/rpk-dir/RackPeek ]; then \
  47. mv /usr/local/bin/rpk-dir/RackPeek /usr/local/bin/rpk; \
  48. else \
  49. echo '#!/bin/sh\nexec dotnet /usr/local/bin/rpk-dir/RackPeek.dll "$@"' > /usr/local/bin/rpk && \
  50. chmod +x /usr/local/bin/rpk; \
  51. fi
  52. # Make sure ASP.NET binds correctly in containers
  53. ENV ASPNETCORE_URLS=http://+:8080
  54. ENV RPK_YAML_DIR=/app/config
  55. # Drop privileges
  56. USER ${APP_UID}
  57. HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \
  58. CMD curl -fsS http://localhost:8080/health || exit 1
  59. ENTRYPOINT ["dotnet", "RackPeek.Web.dll"]