Я пытаюсь предоставить минимальную JRE для тонкого изображения Docker.В jlink 11.0.4, которая поставляется с open-jdk-11 в Ubuntu, образ, созданный с помощью этого пользовательского JRE, на самом деле больше, чем он был бы с JRE по умолчанию.Я думаю, что это связано с очень большим размером cutom_jre / lib / server / libjvm.so
Я слежу за Kubernetes для разработчиков Java из Аруна Гупты в Linkedin Learning.В какой-то момент я заметил странное поведение на моем экземпляре Ubuntu.Наряду с этим курсом мне нужно было предоставить пользовательскую JRE для минимального приложения Spring Boot, чтобы использовать его для тонкого образа Docker.
jlink \
--output myjre \
--add-modules $(jdeps --print-module-deps target/greeting.jar),\
java.xml,jdk.unsupported,java.sql,java.naming,java.desktop,\
java.management,java.security.jgss,java.instrument \
Этот подход отлично работал в курсе и размереmy_jre
подходит для создания минимального образа Docker для приложения.Проблема в том, что в моей настройке я использовал openjdk-11, а не openjdk-9.
В моей настройке результирующий размер my_jre
будет очень большим (~ 380 МБ).После некоторого исследования я обнаружил, что это было главным образом и, возможно, только из-за большого размера my_jre/lib/server/libjvm.so
.
У меня не было никакого предшествующего опыта с jlink
до этой попытки.После некоторых проб и ошибок и просмотра похожих проблем на github я нашел обходной путь, выходящий за пределы функциональности jlink.
Этот обходной путь происходит из пакета binutils и strip утилита.
Запуск утилиты strip
с флагом --strip-unneeded
уменьшит размер libjvm.so и сделает возможным достижение основной цели: обеспечение минимальной JRE (~ 113 МБ)) для тонкого изображения Docker.
strip -p --strip-unneeded myjre/lib/server/libjvm.so
Я был бы признателен за более глубокое объяснение происхождения этого чутья от человека, обладающего знаниями.И что изменилось с jdk9 на jdk11 с точки зрения этого поведения?Есть ли какой-нибудь стандартный процесс для достижения этой цели без каких-либо внешних утилит, кроме тех, которые предоставляет jdk9 +, таких как jlink?