Java 11被宣布为最新的LTS版本。因此,我们正在尝试基于此Java版本启动新服务。
但是,Java 11的基本Docker镜像远大于Java 8的等效镜像:
openjdk:8-jre-alpine
:84 MBopenjdk:11-jre-slim
:283 MB(我只考虑每个Java版本的official OpenJDK和最轻量级的图像。)
更深入的挖掘发现了以下“事物”:
openjdk:11-jre-slim
图像使用基本图像debian:sid-slim
。这带来了两个问题:
这比alpine:3.8
大60 MB
Debian sid
版本不稳定openjdk-11-jre-headless
包比openjdk8-jre
大3倍(在运行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/
更深入地我发现了这种沉重的“根” - 它是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 slim图像的基本图像?UPD:作为这些挑战的解决方案,人们可以使用这个答案:Java 11 application as docker image
为什么
alpine
不再用作Java 11 slim图像的基本图像?
那是因为,遗憾的是,目前还没有针对Alpine的官方稳定的OpenJDK 11版本。
Alpine使用musl libc,而不是大多数Linux用户使用的标准glibc,这意味着JVM必须与musl libc兼容才能支持vanilla Alpine。 OpenJDK端口正在OpenJDK的Portola项目下开发。
目前的状况总结在OpenJDK 11 page上:
目前唯一适用于Alpine的OpenJDK版本是7和8,由IcedTea项目提供。
但是 - 如果你愿意考虑官方OpenJDK之外的其他问题,那么Azul's Zulu OpenJDK提供了一个引人注目的选择:
有关支持可用性和路线图,请参阅Azul support roadmap。
更新,2009年3月6日:截至昨天,openjdk11
可用于Alpine资源库!可以使用以下方法抓住Alpine:
apk --no-cache add openjdk11
该软件包基于jdk11u
OpenJDK分支以及来自项目Portola的移植修复程序,引入了以下PR。非常感谢Alpine团队。
为什么不稳定的sid版本用于LTS Java图像?
这是一个公平的问题/要求。实际上是一个在稳定的Debian版本上提供Java 11的开放票: https://github.com/docker-library/openjdk/issues/237
更新,26/12/18:问题已经解决,现在OpenJDK 11苗条图像基于最近推出的stretch-backports
OpenJDK 11(PR link)。
为什么OpenJDK 11的纤薄/无头/ JRE封装与类似的OpenJDK 8封装相比如此之大?什么是在OpenJDK 11中带来135 MB的模块文件?
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
的大小与9之前的OpenJDK版本相比时,应该减去rt.jar
和tools.jar
的大小(他们应该采取合计约80MB)。
至于07.2019,https://adoptopenjdk.net/对Java 11有正式的Alpine支持:
但是,当一个组装最小应用程序时,仍应考虑模块(jmods,jlink
)。
注意:苗条的图像不包含某些模块(如java.sql
) - 它们被明确排除(https://github.com/AdoptOpenJDK/openjdk-docker/blob/21b8393b9c23f94d6921a56cce27b026537c6ca2/11/jdk/alpine/slim-java.sh#L233)