# Stage 1: Build frontend FROM node:25-alpine AS frontend-build WORKDIR /app/frontend COPY frontend/package.json frontend/package-lock.json ./ RUN npm ci COPY frontend/ ./ # OpenAPI spec needed for type generation (npm run build runs generate:api) COPY backend/src/main/resources/openapi/api.yaml \ ../backend/src/main/resources/openapi/api.yaml RUN npm run build # Stage 2: Build backend with frontend assets baked in FROM eclipse-temurin:25.0.2_10-jdk-alpine AS backend-build WORKDIR /app/backend COPY backend/ ./ COPY --from=frontend-build /app/frontend/dist src/main/resources/static/ RUN ./mvnw -B -DskipTests -Dcheckstyle.skip -Dspotbugs.skip package # Stage 3: Runtime FROM eclipse-temurin:25.0.2_10-jre-alpine WORKDIR /app COPY --from=backend-build /app/backend/target/*.jar app.jar EXPOSE 8080 ENV SPRING_PROFILES_ACTIVE=prod HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \ CMD wget -qO- http://localhost:8080/actuator/health || exit 1 ENTRYPOINT ["java", "-jar", "app.jar"]