问题描述
为什么
alpine
不再将其用作Java 11超薄映像的基础映像?
不幸的是,这是因为目前没有针对Alpine的官方稳定的OpenJDK 11构建。
与目前大多数Linux使用的标准glibc相比,Alpine使用musl libc,这意味着JVM必须与musl libc兼容才能支持香草Alpine。在OpenJDK的Portola项目下正在开发Musl OpenJDK端口。
当前状态汇总在OpenJDK 11页面上:
此页面上先前可用的Alpine Linux构建已从JDK 11 GA中删除。它尚未投入生产,因为它尚未经过充分的测试,无法被视为GA版本。请使用可抢先使用的JDK 12 Alpine Linux构建代替它。
IcedTea项目提供的Alpine唯一稳定的OpenJDK版本是7和8 。
但是,如果您愿意考虑使用官方OpenJDK之外的其他东西,则Azul的Zulu OpenJDK提供了一种引人注目的替代方案:
- 它支持Alpine musl上的Java 11(撰写本文时为11.0.2版);
- 它是经过认证的OpenJDK构建,已使用OpenJDK TCK合规套件进行了验证;
- 它是免费的,开放源代码的,并且可用于docker(Dockerhub)。
截至昨天,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
问题已解决,现在OpenJDK 11超薄映像基于stretch-backports
最近可用的OpenJDK
11(PR链接)。
为什么与类似的OpenJDK 8软件包相比,OpenJDK 11的slim / headless / JRE软件包这么大?在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
OpenJDK
9之前的版本进行比较时,考虑到的大小,应减去rt.jar
和的大小tools.jar
(它们应占用80MB的总和) 。
解决方法
宣布Java 11是最新的LTS版本。因此,我们正在尝试基于此Java版本启动新服务。
但是,Java 11的基本Docker映像比Java 8的等效映像大得多:
-
openjdk:8-jre-alpine
:84 MB -
openjdk:11-jre-slim
: 283 MB
(我只考虑 官方的OpenJDK 和每个Java版本的
最轻量的 映像。)
更深入的挖掘发现了以下“事物”:
-
该
openjdk:11-jre-slim
图像使用基本图像debian:sid-slim
。这带来了两个问题:-
比60 MB大
alpine:3.8
-
在Debian的
sid
版本是不稳定
-
-
openjdk-11-jre-headless
镜像中安装的软件包比(运行Docker容器内部) 大3倍openjdk8-jre
: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/
更深入地讲,我发现了这种繁重的“根”-它modules
是JDK 的文件:
# 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软件包这么大?
- 在OpenJDK 11中带来135 MB的这个 模块 文件是什么?