# Stage 1: Build frontend with Node.js FROM node:22-alpine AS frontend WORKDIR /frontend COPY frontend/package.json frontend/package-lock.json ./ RUN npm ci COPY frontend/ ./ RUN npm run build -- --configuration production # Stage 2: Build backend with Gradle FROM eclipse-temurin:21-jdk AS builder WORKDIR /app COPY backend/build.gradle backend/settings.gradle ./ COPY backend/gradlew ./ COPY backend/gradle/ gradle/ COPY backend/src/ src/ # Copy built frontend assets into Spring static resources COPY --from=frontend /frontend/dist/frontend/browser src/main/resources/static/ RUN chmod +x gradlew && SKIP_FRONTEND=true ./gradlew bootJar --no-daemon # Stage 3: Runtime image FROM eclipse-temurin:21-jre WORKDIR /app COPY --from=builder /app/build/libs/backend-0.0.1-SNAPSHOT.jar app.jar RUN adduser --disabled-password --gecos "" appuser && \ chown appuser:appuser /app USER appuser EXPOSE 8080 HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ CMD wget -q --spider http://localhost:8080/api/system/metrics || exit 1 ENTRYPOINT ["java", "-jar", "app.jar"]