Почему в Docker-образах для Java-приложений часто используют JRE вместо JDK?

«Почему в Docker-образах для Java-приложений часто используют JRE вместо JDK?» — вопрос из категории DevOps, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Использование JRE (Java Runtime Environment) вместо JDK (Java Development Kit) в production Docker-образах является best practice для минимизации размера образа и уменьшения поверхности атаки.

Причины:

  1. Уменьшение размера: JRE содержит только необходимые компоненты для запуска приложений (JVM, библиотеки классов). JDK включает инструменты для разработки (компилятор javac, отладчики, профилировщики), которые не нужны в runtime.
    • Пример: Образ на основе openjdk:11-jre-slim может быть в 2-3 раза меньше, чем openjdk:11-jdk-slim.
  2. Безопасность: Меньшее количество установленных компонентов и библиотек сокращает потенциальные векторы для уязвимостей.
  3. Эффективность: Меньший образ быстрее скачивается, развертывается и потребляет меньше дискового пространства.

Пример 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).