# Stage 1: Build FROM eclipse-temurin:21-jdk-alpine AS build WORKDIR /app # Maven dependency cache (pom.xml değişmezse cache kullanılır) COPY mvnw pom.xml ./ COPY .mvn .mvn RUN ./mvnw dependency:go-offline -B # Kaynak kodu kopyala ve build et COPY src src RUN ./mvnw package -DskipTests -B # Stage 2: Extract layers (cache optimizasyonu için) FROM eclipse-temurin:21-jdk-alpine AS extract WORKDIR /app COPY --from=build /app/target/*.jar app.jar RUN java -Djarmode=layertools -jar app.jar extract # Stage 3: Runtime (minimal image) FROM eclipse-temurin:21-jre-alpine # Güvenlik: non-root user RUN addgroup -S appgroup && adduser -S appuser -G appgroup WORKDIR /app # Layered copy (en az değişen katman önce) COPY --from=extract /app/dependencies/ ./ COPY --from=extract /app/spring-boot-loader/ ./ COPY --from=extract /app/snapshot-dependencies/ ./ COPY --from=extract /app/application/ ./ RUN chown -R appuser:appgroup /app USER appuser EXPOSE 8080 # Health check HEALTHCHECK --interval=30s --timeout=3s --retries=3 \ CMD wget -qO- http://localhost:8080/actuator/health || exit 1 # JVM container-aware flags ENTRYPOINT ["java", \ "-XX:+UseContainerSupport", \ "-XX:MaxRAMPercentage=75.0", \ "-Djava.security.egd=file:/dev/./urandom", \ "org.springframework.boot.loader.launch.JarLauncher"]