# Use the official ASP.NET Core runtime image (optimized) FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base WORKDIR /app EXPOSE 8080 # Install curl for health checks RUN apt-get update && \ apt-get install -y curl && \ rm -rf /var/lib/apt/lists/* # Use the SDK image for building FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build WORKDIR /src # Copy project files first for better layer caching COPY ["LittleShop/LittleShop.csproj", "LittleShop/"] COPY ["LittleShop.Client/LittleShop.Client.csproj", "LittleShop.Client/"] # Restore packages in a separate layer RUN dotnet restore "LittleShop/LittleShop.csproj" \ --runtime linux-x64 \ --no-cache \ --verbosity minimal # Copy source code COPY LittleShop/ LittleShop/ COPY LittleShop.Client/ LittleShop.Client/ WORKDIR "/src/LittleShop" # Build with optimizations RUN dotnet build "LittleShop.csproj" \ -c Release \ -o /app/build \ --no-restore \ --verbosity minimal # Publish stage with optimizations FROM build AS publish RUN dotnet publish "LittleShop.csproj" \ -c Release \ -o /app/publish \ --no-restore \ --runtime linux-x64 \ --self-contained false \ /p:PublishTrimmed=false \ /p:PublishSingleFile=false \ /p:DebugType=None \ /p:DebugSymbols=false # Final optimized stage FROM base AS final WORKDIR /app # Create necessary directories with proper permissions (run as root temporarily) RUN mkdir -p /app/wwwroot/uploads/products \ && mkdir -p /app/data \ && mkdir -p /app/logs \ && chmod -R 755 /app/wwwroot \ && chmod -R 755 /app/data \ && chmod -R 755 /app/logs # Copy published app COPY --from=publish /app/publish . # Health check (disabled for now to avoid startup issues) # HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ # CMD curl -f http://localhost:8080/health || exit 1 # Set environment variables for production ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=0 \ DOTNET_RUNNING_IN_CONTAINER=true \ DOTNET_USE_POLLING_FILE_WATCHER=true \ ASPNETCORE_FORWARDEDHEADERS_ENABLED=true \ ASPNETCORE_URLS=http://+:8080 \ ASPNETCORE_ENVIRONMENT=Production \ ConnectionStrings__DefaultConnection="Data Source=/app/data/littleshop-prod.db" \ SilverPay__BaseUrl="http://31.97.57.205:8001" \ SilverPay__ApiKey="your-api-key-here" # Start as root to ensure permissions (can be improved later) USER root ENTRYPOINT ["dotnet", "LittleShop.dll"]