Java 11 被宣布为最新的 LTS 版本。因此,我们正在尝试基于此 Java 版本启动新服务。
但是,Java 11 的基本 Docker 映像比 Java 8 的等价物大得多:
openjdk:8-jre-alpine
:84 MBopenjdk:11-jre-slim
: 283 MB
(我只考虑 官方的 OpenJDK 和每个 Java 版本 的最轻量级的 图像。)
更深入的挖掘发现了以下“事情”:
openjdk:11-jre-slim
图像使用基础图像debian:sid-slim
。这带来了两个问题:这比
alpine:3.8
大 60 MBDebian
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 映像的基础映像?为什么 LTS Java 镜像使用不稳定的 sid 版本?
为什么 OpenJDK 11 的 slim/headless/JRE 包与类似的 OpenJDK 8 包相比如此之大?
- 这个在 OpenJDK 11 中带来 135 MB 的 模块 文件是什么?
UPD :作为这些挑战的解决方案,可以使用以下答案: Java 11 application as docker image
原文由 radistao 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是因为,遗憾的是,目前还没有针对 Alpine 的官方稳定 OpenJDK 11 构建。
Alpine 使用 musl libc,而不是大多数 Linux 使用的标准 glibc,这意味着 JVM 必须与 musl libc 兼容才能支持 vanilla Alpine。 musl OpenJDK 端口正在 OpenJDK 的 Portola 项目下开发。
OpenJDK 11 页面 上总结了当前状态:
Alpine 目前唯一稳定的 OpenJDK 版本是 7 和 8,由 IcedTea 项目提供。
但是 - 如果您愿意考虑官方 OpenJDK 以外的其他选择, Azul 的 Zulu OpenJDK 提供了一个引人注目的替代方案:
有关支持可用性和路线图,请参阅 Azul 支持路线图。
2019 年 3 月 6 日更新: 截至昨天,
openjdk11
在 Alpine 存储库中可用!可以使用以下方法在 Alpine 上抓取它:该软件包基于
jdk11u
OpenJDK 分支以及来自 Portola 项目的移植修复,并通过以下 PR 引入。非常感谢 Alpine 团队。这是一个公平的问题/要求。实际上有一张在稳定的 Debian 版本上提供 Java 11 的公开票:
https://github.com/docker-library/openjdk/issues/237
更新,26/12/18: 问题已解决,现在 OpenJDK 11 slim 映像基于最近发布的
stretch-backports
OpenJDK 11( 公关链接)。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 的总和)。