Почему базовый образ Docker для Java 11 такой большой? (OpenJDK: 11-JRE-тонкий) - PullRequest
0 голосов
/ 19 ноября 2018

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

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

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

При более глубоком копании обнаружены следующие "вещи": ​​

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

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

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

  • пакет 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?

    • Что это за файл modules , который приносит 135 МБ в OpenJDK 11?

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

Ответы [ 2 ]

0 голосов
/ 22 июля 2019

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

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

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

0 голосов
/ 20 ноября 2018

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

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

Alpine использует musl libc, в отличие от стандартного glibc, используемого большинством Linux-систем, что означает, что JVM должна быть совместима с musl libc для поддержки vanilla Alpine. Порт musJ 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 . Слава и огромное спасибо альпийской команде.

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

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

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

Почему пакет slim / headless / JRE для OpenJDK 11 такой большой по сравнению с аналогичным пакетом OpenJDK 8? Что это за файл modules , который приносит 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 при сравнении с сборками до 9 OpenJDK размеры rt.jar и tools.jar должны быть вычтены (они должны занимать около 80 МБ вместе взятых).

...