Multi-Stage Spring Boot Dockerfile
Spring Boot uygulamaları için optimize edilmiş multi-stage Dockerfile. Layered JAR, non-root user ve health check dahil.
By Tolgahan
·
·
375 görüntülenme
# 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"]
# 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"]
AI Asistan
Sorularını yanıtlamaya hazır