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
в 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?Почему для образов LTS Java используется нестабильная версия sid ?
Почему пакет slim / headless / JRE для OpenJDK 11 такой большой по сравнению с аналогичным пакетом OpenJDK 8?
- Что это за файл модулей, который дает 135 МБ в OpenJDK 11?
UPD : в качестве решения этих проблем можно использовать следующий ответ: приложение Java 11 как образ докера
Ответы:
Это потому, что, к сожалению, в настоящее время нет официальной стабильной сборки OpenJDK 11 для Alpine.
Alpine использует musl libc, в отличие от стандартного glibc, используемого большинством Linux, а это означает, что JVM должна быть совместима с musl libc для поддержки vanilla Alpine. Порт musl OpenJDK разрабатывается под OpenJDK проекта Portola .
Текущий статус представлен на странице OpenJDK 11 :
Единственными стабильными версиями OpenJDK для Alpine в настоящее время являются 7 и 8, предоставляемые проектом IcedTea .
Однако - если вы хотите рассмотреть что-то другое, кроме официального OpenJDK, Zulu от Azul OpenJDK от предлагает убедительную альтернативу:
Информацию о доступности поддержки и дорожной карте см. В дорожной карте поддержки Azul .
Обновление от 3/6/19: Со вчерашнего дня
openjdk11
доступно в репозиториях Alpine! Его можно было схватить на Alpine, используя:Пакет основан на
jdk11u
ветке OpenJDK плюс перенесенные исправления из проекта Portola, представленные в следующем PR . Престижность и огромное спасибо команде Alpine.Это справедливый вопрос / просьба. На самом деле есть открытый билет для предоставления Java 11 в стабильной версии Debian:
https://github.com/docker-library/openjdk/issues/237
Обновление, 26/12/18: проблема решена, и теперь тонкий образ
stretch-backports
OpenJDK 11 основан на OpenJDK 11, который недавно стал доступен ( ссылка для PR ).В 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 МБ вместе) .источник
по состоянию на 07.2019 https://adoptopenjdk.net/ имеет официальную поддержку Alpine для Java 11:
https://github.com/AdoptOpenJDK/openjdk-docker/blob/master/11/jdk/alpine/
https://hub.docker.com/r/adoptopenjdk/openjdk11
Тем не менее, модули ( jmods ,
jlink
) все же следует учитывать при сборке минимального приложения.Примечание : тонкие изображения не содержат некоторых модулей (например,
java.sql
) - они явно исключены ( https://github.com/AdoptOpenJDK/openjdk-docker/blob/21b8393b9c23f94d6921a56cce27b026537c6ca2/11/jdk/alpine/slim-java.sh#L )источник
Если вы рассматриваете только официальные изображения и ваше целевое достижение - использовать доступное изображение JRE меньшего размера, я бы посоветовал вам взглянуть на официальный образ OpenJDK, размер
openjdk:11-jre-slim-buster
которого составляет всего 69,2 МБ.источник
https://hub.docker.com/_/openjdk?tab=tags&page=1&name=11.0.7-jre-slim
в репозитории docker openjdk размер slim jre 11 меньше 70 МБ
источник