Java 11 объявлена самой последней версией LTS. Итак, мы пытаемся запустить новые сервисы на основе этой версии Java.
Однако базовый образ Docker для Java 11 намного больше, чем эквивалент для Java 8:
-
openjdk:8-jre-alpine
: 84 МБ -
openjdk:11-jre-slim
: 283 МБ
(Я рассматриваю только официальный OpenJDK и самые легкие изображения для каждой версии Java.)
При более глубоком копании были обнаружены следующие "вещи":
-
изображение
openjdk:11-jre-slim
использует базовое изображениеdebian:sid-slim
. Это приносит 2 проблемы:-
это на 60 МБ больше, чем у
alpine:3.8
-
версии
sid
Debian нестабильны
-
-
openjdk-11-jre-headless
, установленный в образе, в 3 раза больше, чемopenjdk8-jre
(внутри работающего контейнера Docker):-
openjdk:8-jre-alpine
:/ # du -hs /usr/lib/jvm/java-1.8-openjdk/jre/lib/ 57.5M /usr/lib/jvm/java-1.8-openjdk/jre/lib/
-
openjdk:11-jre-slim
:# du -sh /usr/lib/jvm/java-11-openjdk-amd64/lib/ 179M /usr/lib/jvm/java-11-openjdk-amd64/lib/
Пройдя глубже, я обнаружил "корень" этой тяжести - файл
modules
JDK:# ls -lhG /usr/lib/jvm/java-11-openjdk-amd64/lib/modules 135M /usr/lib/jvm/java-11-openjdk-amd64/lib/modules
-
Итак, теперь вопросы, которые пришли:
-
Почему
alpine
не используется в качестве базового образа для изображений Java 11 slim? -
Почему нестабильная версия sid используется для образов LTS Java?
-
Почему пакет slim/headless/JRE для OpenJDK 11 такой большой по сравнению с аналогичным пакетом OpenJDK 8?
- Что это за файл модулей, который приносит 135 МБ в OpenJDK 11?
UPD: в качестве решения этих проблем можно использовать этот ответ: приложение Java 11 как образ докера