Чому зображення базового Docker Java 11 настільки велике? (openjdk: 11-jre-slim)


145

Java 11 оголошено як останню версію LTS. Отже, ми намагаємося запускати нові сервіси на основі цієї версії Java.

Однак базове зображення Docker для Java 11 набагато більше, ніж еквівалент для Java 8:

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

Глибше копання виявило такі "речі":

  • openjdk:11-jre-slimзображення використовує базове зображення debian:sid-slim. Це стосується двох питань:

    • це на 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?

  • Чому нестабільна версія sid використовується для зображень Java LTS?

  • Чому тонкий / безголовий / пакет JRE для OpenJDK 11 настільки великий порівняно з аналогічним пакетом OpenJDK 8?

    • Що це за модуль, який приносить 135 Мб у OpenJDK 11?

UPD : як рішення цих завдань можна використовувати цю відповідь: додаток Java 11 як зображення докера


1
Добре для однієї нової версії (JDK 9+) Java є модульованою , що пояснює, чому є модулі в 11 проти 8.
Zachary Craig

1
Пов’язане читання, можливо - Benchmarking Debian vs Alpine як базовий образ Docker
Наман

13
Не існує JRE 11, тож у вас є повний JDK. Ви можете створювати компактні середовища, навіть стрункіші, ніж JRE 8, але для цього потрібна реальна модульна програма, щоб залежності були відомі.
Холгер

1
Крім вищезазначеного, не всі ті модулі, які ви вважаєте причиною збільшення розміру, насправді потрібні вашим програмам. Але щоб з’ясувати, які саме з них ви переходите до створення модульної програми. Для цього ви можете дізнатися більше про jlink (представлений у Java9).
Наман

1
Що може бути кращим часом, щоб прочитати це в Інтернеті - twitter.com/LogicTheoryIO/status/1064503559071371265
Наман

Відповіді:


172

Чому він більше alpineне використовується як базовий образ для тонких зображень Java 11?

Це тому, що, на жаль, в даний час немає офіційної стабільної версії OpenJDK 11 для Alpine.

Alpine використовує musl libc, на відміну від стандартного glibc, який використовується більшістю Linuxes там, що означає, що JVM повинен бути сумісний з musl libc для підтримки ванілі Alpine. Музичний порт OpenJDK розробляється в рамках проекту PortoJDK Portola .

Поточний статус підсумований на сторінці OpenJDK 11 :

Раніше доступна на цій сторінці збірка Alpine Linux була видалена станом на JDK 11 GA. Це не готово до виробництва, оскільки воно не було достатньо ретельно випробувано, щоб вважати складанням GA. Будь-ласка, використовуйте програму JDK 12 Alpine Linux для раннього доступу на її місці.

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

Однак - якщо ви готові розглянути інше, ніж офіційний OpenJDK, Zulu OpenJDK Azul пропонує переконливу альтернативу:

  • Він підтримує Java 11 на Alpine musl (версія 11.0.2 станом на час написання);
  • Це сертифікована збірка OpenJDK, перевірена за допомогою набору стандартів OpenJDK TCK;
  • Він безкоштовний, з відкритим кодом та докер готовий ( Dockerhub ).

Інформацію про доступність підтримки та дорожню карту див . У дорожній карті підтримки Azul .

Оновлення, 3/6/19: З вчорашнього дня openjdk11доступне в альпійських сховищах! Його можна захопити на альпійських, використовуючи:

apk --no-cache add openjdk11

Пакет базується на jdk11uгілці OpenJDK плюс перенесені виправлення проекту Portola, представлені з наступним PR . Кудо і величезне спасибі команді Альпійців.

Чому нестабільна версія sid використовується для зображень Java LTS?

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

Оновлення, 26.12.18: Проблема вирішена, і тепер тонкий образ stretch-backportsOpenJDK 11 заснований на OpenJDK 11, який нещодавно був доступний ( посилання PR ).

Чому тонкий / безголовий / пакет 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 МБ разом) .


9

станом на 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#L233 )


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.