# Stage 1: Build React client FROM node:22-alpine AS client-build WORKDIR /app/client COPY src/Budget.Client/package*.json ./ RUN npm ci COPY src/Budget.Client/ ./ ARG VITE_AUTH_AUTHORITY=https://auth.stwaddle.com/ ARG VITE_AUTH_CLIENT_ID=budget-client ARG VITE_AUTH_REDIRECT_URI=https://budget.stwaddle.com/callback ENV VITE_AUTH_AUTHORITY=$VITE_AUTH_AUTHORITY ENV VITE_AUTH_CLIENT_ID=$VITE_AUTH_CLIENT_ID ENV VITE_AUTH_REDIRECT_URI=$VITE_AUTH_REDIRECT_URI RUN npm run build # Stage 2: Build and publish ASP.NET app FROM mcr.microsoft.com/dotnet/sdk:10.0 AS api-build WORKDIR /app COPY Budget.sln ./ COPY src/Budget.Api/ ./src/Budget.Api/ RUN dotnet publish src/Budget.Api/Budget.Api.csproj -c Release -o /publish # Stage 3: Runtime image FROM mcr.microsoft.com/dotnet/aspnet:10.0 WORKDIR /app COPY --from=api-build /publish ./ COPY --from=client-build /app/client/dist ./wwwroot EXPOSE 8080 ENTRYPOINT ["dotnet", "Budget.Api.dll"]