Dockerize Spring
Тема дорожной карты · Spring Boot
Контейнеризация Spring Boot-приложения — это процесс упаковки Spring Boot-приложения и его зависимостей времени выполнения в Docker-образ для единообразного развёртывания в средах разработки, тестирования и продакшена. Наиболее явный подход — написание многоэтапного Dockerfile: на первом этапе используется полноценный JDK-образ для выполнения ./mvnw package -DskipTests, а на втором — скомпилированный fat JAR копируется в минимальный JRE-образ (например, eclipse-temurin:21-jre-alpine) и устанавливается ENTRYPOINT ["java", "-jar", "app.jar"]. Для эффективного кэширования слоёв функция layered JAR в Spring Boot (включаемая через <layers> в плагине Maven) разбивает JAR на слои dependencies, snapshot-dependencies, resources и application, максимизируя повторное использование кэша Docker при повторных сборках. Альтернативой ручному написанию Dockerfile является ./mvnw spring-boot:build-image, который использует Cloud Native Buildpacks для создания OCI-образа с оптимальным порядком слоёв и автоматической настройкой JVM для контейнерных сред. При контейнеризации Spring Boot-приложения для Kubernetes конфигурация, специфичная для среды, внедряется через инструкции ENV или через Kubernetes ConfigMaps/Secrets, сопоставляемые с переменными окружения Spring Boot, такими как SPRING_DATASOURCE_URL.
Как это работает
Dockerize Spring: Docker-образы через Spring Boot bootBuildImage (Cloud Native Buildpacks — layered, secure, маленькие образы) или hand-written Dockerfile. GraalVM native image (./gradlew nativeCompile) — static binary с sub-100ms startup + меньше памяти, отлично для serverless, дорого по build time + framework support. Graceful shutdown (server.shutdown=graceful) даёт in-flight запросам завершиться на SIGTERM. Production-ready config: тюньте JVM, выставьте heap, включите Actuator, log JSON, конфигурируйте connection pools (HikariCP дефолты обычно ок).
Когда применять
Buildpacks для большинства случаев — layered cache, security patches, без Dockerfile в поддержке. Native image — для serverless или fast-start workloads; верифицируйте что все зависимости поддерживают. Всегда graceful shutdown в K8s деплоях — abrupt termination дропает in-flight запросы. Memory limits + JVM tuning явно (не полагайтесь на auto-detect в контейнерах).
Типичные ошибки
Ловушки Dockerize Spring: деплой fat jar без health checks (K8s не может безопасно роутить трафик); 1GB+ Docker-образы со build artefacts (Buildpacks или multi-stage builds); нет graceful shutdown (rolling deploy дропает пользовательские запросы); JVM heap не выставлен, OOMKilled по K8s memory limit.