3

我正在尝试为纤薄的 Docker 映像提供最小的 JRE。使用 Ubuntu 上的 open-jdk-11 附带的 jlink 11.0.4,使用此自定义 JRE 构建的映像实际上大于使用默认 JRE 构建的映像。我认为这是由于 cutom_jre/lib/server/libjvm.so 的大小非常大

我正在关注来自 Arun Gupta 的 Kubernetes for Java Developers on Linkedin Learning。在某些时候,我注意到我的 Ubuntu 实例上有一个奇怪的行为。除了这门课程,我还需要为一个最小的 Spring Boot 应用程序提供一个自定义 JRE,以便将它用于一个纤薄的 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会非常大(~380mb)。经过一番调查,我发现这主要而且可能只是由于my_jre/lib/server/libjvm.so.

jlink在此尝试之前,我没有任何经验。经过一些试验和错误,并浏览了 github 上的类似问题,我找到了 jlink 功能之外的解决方法。

此解决方法来自binutils包和strip实用程序。

使用该标志运行该strip实用程序--strip-unneeded将缩小 libjvm.so 的大小,并有可能实现主要目标:为苗条的 Docker 映像提供最小的 JRE(~113mb)。

strip -p --strip-unneeded myjre/lib/server/libjvm.so

我希望有知识的人能更深入地解释这种天赋的背景。就这种行为而言,从 jdk9 到 jdk11 还有什么变化?除了 jdk9+ 提供的工具(例如 jlink)之外,是否有任何标准流程可以在没有任何外部工具的情况下实现这一目标?

4

1 回答 1

2

还有其他选项可用于减小 jlink 的大小。

--strip-debug --no-header-files --no-man-pages

如需帮助,请参阅“jlink --help”

我还尝试创建自定义 JRE。我得到了将近 415 MB 的 libjvm.so。通过上面提到的选项,我将 JRE 大小设置为 39.7 MB。

于 2020-07-17T06:14:14.853 回答