Почему базовый образ Docker Java 11 такой большой? (openjdk: 11-jre-slim)

150

Java 11 объявлена ​​самой последней версией LTS. Итак, мы пытаемся запустить новые службы на основе этой версии Java.

Однако базовый образ Docker для Java 11 намного больше, чем эквивалент для Java 8:

(Я рассматриваю только официальный OpenJDK и самые легкие изображения для каждой версии Java.)

Более глубокое копание выявило следующие "вещи":

  • openjdk:11-jre-slimизображение использует базовое изображение debian:sid-slim. Это вызывает 2 проблемы:

    • это на 60 МБ больше, чем alpine:3.8

    • в Debiansid версии нестабильны

  • 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?

  • Почему для образов LTS Java используется нестабильная версия sid ?

  • Почему пакет slim / headless / JRE для OpenJDK 11 такой большой по сравнению с аналогичным пакетом OpenJDK 8?

    • Что это за файл модулей, который дает 135 МБ в OpenJDK 11?

UPD : в качестве решения этих проблем можно использовать следующий ответ: приложение Java 11 как образ докера

Radistao
источник
1
Ну для одной новой версии (JDK 9+) Ява являются модульными , что объясняет , почему есть модули 11 против 8.
Zachary Craig
1
Связанное чтение возможно - Сравнение Debian и Alpine в качестве базового образа Docker
Наман
13
JRE 11 не существует, поэтому у вас есть полный JDK. Вы можете создавать компактные среды, даже более тонкие, чем JRE 8, но для этого требуется фактическое модульное приложение, чтобы были известны зависимости.
Holger
1
В дополнение к вышесказанному, не все те модули, которые вы считаете причиной увеличения размера, действительно необходимы для ваших приложений. Но чтобы выяснить, какие из них, вам следует перейти к созданию модульного приложения. Вы можете узнать больше о jlink (введенном в Java9) для этого.
Наман
1
Что может быть лучшим временем, чтобы прочитать это в Интернете - twitter.com/LogicTheoryIO/status/1064503559071371265
Наман,

Ответы:

179

Почему больше alpineне используется в качестве базового образа для тонких образов Java 11?

Это потому, что, к сожалению, в настоящее время нет официальной стабильной сборки OpenJDK 11 для Alpine.

Alpine использует musl libc, в отличие от стандартного glibc, используемого большинством Linux, а это означает, что JVM должна быть совместима с musl libc для поддержки vanilla Alpine. Порт musl OpenJDK разрабатывается под OpenJDK проекта Portola .

Текущий статус представлен на странице OpenJDK 11 :

Сборка Alpine Linux, ранее доступная на этой странице, была удалена в JDK 11 GA. Он не готов к производству, потому что не был достаточно тщательно протестирован, чтобы считаться сборкой GA. Пожалуйста, используйте вместо нее сборку JDK 12 Alpine Linux с ранним доступом.

Единственными стабильными версиями OpenJDK для Alpine в настоящее время являются 7 и 8, предоставляемые проектом IcedTea .

Однако - если вы хотите рассмотреть что-то другое, кроме официального OpenJDK, Zulu от Azul OpenJDK от предлагает убедительную альтернативу:

  • Он поддерживает Java 11 на Alpine musl (версия 11.0.2 на момент написания);
  • Это сертифицированная сборка OpenJDK, проверенная с помощью пакета соответствия OpenJDK TCK;
  • Это бесплатно, с открытым исходным кодом и готово для докеров ( Dockerhub ).

Информацию о доступности поддержки и дорожной карте см. В дорожной карте поддержки Azul .

Обновление от 3/6/19: Со вчерашнего дня openjdk11доступно в репозиториях Alpine! Его можно было схватить на Alpine, используя:

apk --no-cache add openjdk11

Пакет основан на jdk11uветке OpenJDK плюс перенесенные исправления из проекта Portola, представленные в следующем PR . Престижность и огромное спасибо команде Alpine.

Почему для образов LTS Java используется нестабильная версия sid ?

Это справедливый вопрос / просьба. На самом деле есть открытый билет для предоставления Java 11 в стабильной версии Debian:
https://github.com/docker-library/openjdk/issues/237

Обновление, 26/12/18: проблема решена, и теперь тонкий образ stretch-backportsOpenJDK 11 основан на OpenJDK 11, который недавно стал доступен ( ссылка для PR ).

Почему пакет slim / headless / JRE для OpenJDK 11 такой большой по сравнению с аналогичным пакетом OpenJDK 8? Что это за файл модулей, который дает 135 МБ в OpenJDK 11?

В Java 9 представлена ​​модульная система, которая представляет собой новый и улучшенный подход к группировке пакетов и ресурсов по сравнению с файлами jar. В этой статье Oracle очень подробно рассказывается об этой функции:
https://www.oracle.com/corporate/features/understanding-java-9-modules.html

Этот modulesфайл объединяет все модули, поставляемые с JRE. Полный список модулей можно распечатать с помощью java --list-modules.modulesдействительно очень большой файл, и, как уже говорилось, он содержит все стандартные модули, и поэтому он довольно раздут.

Однако следует отметить, что он заменяет rt.jarи tools.jar, среди прочего, устарел, поэтому при учете размера modulesпри сравнении со сборками OpenJDK до 9, размеры rt.jarи tools.jarдолжны быть вычтены (они должны занимать около 80 МБ вместе) .

Valiano
источник
10

по состоянию на 07.2019 https://adoptopenjdk.net/ имеет официальную поддержку Alpine для Java 11:

Тем не менее, модули ( jmods , jlink) все же следует учитывать при сборке минимального приложения.

Примечание : тонкие изображения не содержат некоторых модулей (например, java.sql) - они явно исключены ( https://github.com/AdoptOpenJDK/openjdk-docker/blob/21b8393b9c23f94d6921a56cce27b026537c6ca2/11/jdk/alpine/slim-java.sh#L )

Radistao
источник
2

Если вы рассматриваете только официальные изображения и ваше целевое достижение - использовать доступное изображение JRE меньшего размера, я бы посоветовал вам взглянуть на официальный образ OpenJDK, размерopenjdk:11-jre-slim-buster которого составляет всего 69,2 МБ.

davide79
источник