# Frontend Build Stage FROM node:20-alpine AS frontend-build WORKDIR /app/frontend # Nur package files zuerst kopieren für besseres Caching COPY src/frontend/package*.json ./ RUN npm ci --only=production # Frontend Source Code kopieren COPY src/frontend/ ./ # Frontend bauen RUN npm run build # Backend Build Stage FROM maven:3.9-eclipse-temurin-23 AS backend-build WORKDIR /app # Nur pom.xml zuerst für besseres Dependency Caching COPY pom.xml ./ RUN mvn dependency:go-offline -B # Backend Source Code kopieren (ohne frontend) COPY src ./src # Frontend Build Results kopieren COPY --from=frontend-build /app/frontend/dist ./src/main/resources/static # Build mit optimierten Maven Settings RUN mvn clean package -DskipTests -B -T 1C # Runtime Stage - Optimiert FROM eclipse-temurin:23-jre-alpine # Sicherheit: Non-root User RUN addgroup -g 1001 -S appgroup && \ adduser -u 1001 -S appuser -G appgroup WORKDIR /app # App kopieren COPY --from=backend-build --chown=appuser:appgroup /app/target/*.jar app.jar # Wechsel zu non-root user USER appuser # Health check hinzufügen (optional, passe den Pfad an) HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost:8080/actuator/health || exit 1 EXPOSE 8080 # JVM Memory Optimierungen ENV JAVA_OPTS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0 -XX:+ExitOnOutOfMemoryError" ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]