Ответ
Упаковка готового JAR-файла в Docker-образ создает самодостаточную, переносимую единицу развертывания, что является ключевой практикой в DevOps.
Ключевые преимущества:
- Гарантированная воспроизводимость и консистентность: Образ содержит все необходимое: JAR, конкретную версию JVM, системные зависимости. Приложение будет работать идентично на любом хосте (dev, stage, prod), устраняя проблему "у меня на машине работает".
- Изоляция: Контейнер изолирует приложение и его зависимости от хост-системы и других контейнеров. Нет конфликтов версий Java или библиотек.
- Упрощение развертывания и оркестрации:
- Не требуется устанавливать и настраивать JVM на целевых серверах.
- Образ — это артефакт, который легко передавать по CI/CD-конвейеру.
- Идеально подходит для оркестраторов (Kubernetes, Docker Swarm), которые управляют контейнерами как стандартными единицами.
- Быстрое масштабирование: Новые экземпляры приложения запускаются за секунды путем развертывания того же образа.
- Эффективное использование ресурсов: Контейнеры легче виртуальных машин, так как разделяют ядро ОС хоста.
Типичный Dockerfile для Spring Boot приложения:
# 1. Базовый образ с нужной версией JDK для сборки
FROM eclipse-temurin:17-jdk-jammy AS builder
WORKDIR /workspace/app
COPY . .
RUN ./mvnw clean package -DskipTests
# 2. Финальный образ с JRE для запуска (меньше размер)
FROM eclipse-temurin:17-jre-jammy
VOLUME /tmp
# 3. Копируем готовый JAR из стадии builder
COPY --from=builder /workspace/app/target/*.jar app.jar
# 4. Оптимизация для контейнеризации (кеш классов, безопасный случайный генератор)
ENTRYPOINT ["java", "-jar", "-Djava.security.egd=file:/dev/./urandom", "-XX:+UseContainerSupport", "-XX:MaxRAMPercentage=75.0", "/app.jar"]
Сборка и запуск:
# Сборка образа с тегом
docker build -t my-company/my-app:1.0.0 .
# Запуск контейнера с пробросом порта
docker run -p 8080:8080 my-company/my-app:1.0.0