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показывает реальный опыт.