Gymterview
middle

Как написать Dockerfile для Spring Boot приложения?

Dockerfile для Spring Boot приложения варьируется от простого (JAR уже собран) до production-ready (multi-stage build с health check и непривилегированным пользователем).

Вариант 1: простой Dockerfile (JAR уже собран)

Пример
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY target/myapp-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

Вариант 2: production-ready multi-stage build с Maven

Полный Dockerfile
# Стадия сборки
FROM maven:3.9-eclipse-temurin-17 AS build
WORKDIR /app

# Кэширование зависимостей
COPY pom.xml .
RUN mvn dependency:go-offline -B

# Сборка
COPY src ./src
RUN mvn package -DskipTests -B

# Стадия запуска
FROM eclipse-temurin:17-jre-alpine
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
WORKDIR /app

COPY --from=build /app/target/*.jar app.jar
RUN chown -R appuser:appgroup /app
USER appuser

EXPOSE 8080

HEALTHCHECK --interval=30s --timeout=10s --retries=3 --start-period=40s \
  CMD wget --no-verbose --tries=1 --spider http://localhost:8080/actuator/health || exit 1

ENTRYPOINT ["java", \
  "-XX:+UseContainerSupport", \
  "-XX:MaxRAMPercentage=75.0", \
  "-Djava.security.egd=file:/dev/./urandom", \
  "-jar", "app.jar"]

Ключевые моменты

  • Используйте eclipse-temurin (бывший AdoptOpenJDK) — это стабильные production-ready образы
  • Для production берите jre, а не jdk
  • Образы на базе alpine значительно компактнее
  • Флаг -XX:+UseContainerSupport (включён по умолчанию с JDK 10+) позволяет JVM корректно определять лимиты CPU и памяти, установленные контейнером
  • -XX:MaxRAMPercentage=75.0 — JVM будет использовать не более 75% доступной памяти контейнера под heap
  • -Djava.security.egd=file:/dev/./urandom — ускоряет запуск за счёт использования неблокирующего источника энтропии

На собеседовании: будьте готовы написать Dockerfile для Spring Boot с нуля. Минимальный вариант — 5 строк (FROM, WORKDIR, COPY, EXPOSE, ENTRYPOINT). Для production добавьте: multi-stage build, непривилегированного пользователя, health check, JVM-флаги для контейнеров. Знание -XX:MaxRAMPercentage и UseContainerSupport показывает реальный опыт.