Ответ
Использование JRE (Java Runtime Environment) вместо JDK (Java Development Kit) в production Docker-образах является best practice для минимизации размера образа и уменьшения поверхности атаки.
Причины:
- Уменьшение размера: JRE содержит только необходимые компоненты для запуска приложений (JVM, библиотеки классов). JDK включает инструменты для разработки (компилятор
javac, отладчики, профилировщики), которые не нужны в runtime.- Пример: Образ на основе
openjdk:11-jre-slimможет быть в 2-3 раза меньше, чемopenjdk:11-jdk-slim.
- Пример: Образ на основе
- Безопасность: Меньшее количество установленных компонентов и библиотек сокращает потенциальные векторы для уязвимостей.
- Эффективность: Меньший образ быстрее скачивается, развертывается и потребляет меньше дискового пространства.
Пример Dockerfile:
# Используем минимальный JRE-образ
FROM openjdk:11-jre-slim
# Копируем собранный JAR-файл
COPY target/myapp.jar /app.jar
# Запускаем приложение
ENTRYPOINT ["java", "-jar", "/app.jar"]
Когда использовать JDK в образе? Только на этапе сборки (multi-stage build) или для специальных задач (отладка в dev-среде, выполнение скриптов, требующих javac).