# Ultra-optimized layered build using Distroless # Expected size: ~180-220MB with better caching FROM gcr.io/distroless/java21-debian12:nonroot as base # Stage 1: Extract JAR layers for optimal caching FROM eclipse-temurin:21-jdk-alpine as extractor WORKDIR /app COPY build/libs/*.jar app.jar RUN java -Djarmode=layertools -jar app.jar extract # Stage 2: Production image with extracted layers FROM base WORKDIR /app # Copy layers in dependency order (best caching) COPY --from=extractor /app/dependencies/ ./ COPY --from=extractor /app/spring-boot-loader/ ./ COPY --from=extractor /app/snapshot-dependencies/ ./ COPY --from=extractor /app/application/ ./ EXPOSE 8080 # Optimized JVM settings for micro-containers ENTRYPOINT ["java", \ "-XX:+UseContainerSupport", \ "-XX:MaxRAMPercentage=70.0", \ "-XX:+UseG1GC", \ "-XX:+UseStringDeduplication", \ "-XX:+CompactStrings", \ "-Xshare:on", \ "-Djava.security.egd=file:/dev/./urandom", \ "-Dspring.backgroundpreinitializer.ignore=true", \ "org.springframework.boot.loader.JarLauncher"]