我正在尝试为纤薄的 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 功能之外的解决方法。
使用该标志运行该strip
实用程序--strip-unneeded
将缩小 libjvm.so 的大小,并有可能实现主要目标:为苗条的 Docker 映像提供最小的 JRE(~113mb)。
strip -p --strip-unneeded myjre/lib/server/libjvm.so
我希望有知识的人能更深入地解释这种天赋的背景。就这种行为而言,从 jdk9 到 jdk11 还有什么变化?除了 jdk9+ 提供的工具(例如 jlink)之外,是否有任何标准流程可以在没有任何外部工具的情况下实现这一目标?