宣布Java 11是最新的LTS版本。因此,我们正在尝试基于此Java版本启动新服务。
但是,Java 11的基本Docker映像比Java 8的等效Docker映像大得多。
openjdk:8-jre-alpine
:84 MB
openjdk:11-jre-slim
: 283 MB
(每个Java版本仅考虑official OpenJDK和 最轻巧的 图片。)
更深入的挖掘发现了以下“事物”:
openjdk:11-jre-slim
图像使用基本图像debian:sid-slim
。这带来了2个问题:
这比alpine:3.8
Debian sid
版本不稳定
映像中安装的openjdk-11-jre-headless
软件包比openjdk8-jre
(在运行Docker容器内部)大3倍:
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/
再深入一点,我发现了这种繁琐的“根源”-它是JDK的modules
文件:
# 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 版本用于LTS Java映像?
为什么与类似的OpenJDK 8软件包相比,OpenJDK 11的slim / headless / JRE软件包这么大?
UPD :作为针对这些挑战的解决方案,可以使用以下答案:Java 11 application as docker image
答案 0 :(得分:91)
为什么
alpine
不再用作Java 11超薄图像的基本图像?
这是因为,令人遗憾的是,目前没有针对Alpine的官方稳定的OpenJDK 11构建。
Alpine使用musl libc,而不是那里的大多数Linux使用的标准glibc,这意味着JVM必须与musl libc兼容才能支持香草Alpine。 musl OpenJDK端口是在OpenJDK的Portola项目下开发的。
当前状态总结在OpenJDK 11 page上:
此页面上先前可用的Alpine Linux构建已从JDK 11 GA开始删除。它尚未投入生产,因为它尚未经过充分的测试,无法被视为GA版本。请使用可早期使用的JDK 12 Alpine Linux构建代替。
目前IcedTea项目提供的Alpine唯一稳定的OpenJDK版本是7和8。
但是-如果您愿意考虑使用官方OpenJDK之外的其他东西,Azul's Zulu OpenJDK提供了一种引人注目的替代方案:
不利的一面是,LTS支持仅适用于企业客户,而不能保证获得社区版本(有关更多详细信息,请参见Azul support roadmap)。
为什么不稳定的 sid 版本用于LTS Java映像?
这是一个公平的问题/要求。实际上有一个开放的票证可以在稳定的Debian版本上提供Java 11:
https://github.com/docker-library/openjdk/issues/237
更新,2018年12月26日:,此问题已解决,现在OpenJDK 11超薄映像基于stretch-backports
OpenJDK 11(最近可用)({{3 }}。
为什么与类似的OpenJDK 8软件包相比,OpenJDK 11的slim / headless / JRE软件包这么大?在OpenJDK 11中带来135 MB的 modules 文件是什么?
Java 9引入了模块系统,与jar文件相比,这是一种对包和资源进行分组的新方法和改进方法。 Oracle的这篇文章对此功能进行了非常详细的介绍:
PR link
modules
文件捆绑了JRE随附的所有模块。模块的完整列表可以用java --list-modules
打印。 modules
确实是一个非常大的文件,并且正如所评论的那样,它包含所有标准模块,因此非常膨胀。
但是要注意的一件事是,它取代了已弃用的rt.jar
和tools.jar
,因此,与9之前的OpenJDK相比,考虑modules
的大小时构建时,应减去rt.jar
和tools.jar
的大小(它们总共要占用80MB)。
答案 1 :(得分:4)
如果您仅考虑使用官方图像,而您的目标目标是使用较小的JRE图像,建议您查看官方OpenJDK 图像openjdk:11-jre-slim-buster
,该图像仅为69.2 MB。
答案 2 :(得分:0)
2019年7月https://adoptopenjdk.net/的官方Alpine支持Java 11:
但是,当一个汇编最小的应用程序时,仍应考虑模块( jmods ,jlink
)。
注意: slim 图像不包含某些模块(例如java.sql
)-它们被明确排除(https://github.com/AdoptOpenJDK/openjdk-docker/blob/21b8393b9c23f94d6921a56cce27b026537c6ca2/11/jdk/alpine/slim-java.sh#L233)
答案 3 :(得分:0)
https://hub.docker.com/_/openjdk?tab=tags&page=1&name=11.0.7-jre-slim
在docker openjdk存储库中,苗条的jre 11映像小于70mb