Java 11被宣布为最新的LTS版本。因此,我们试图在这个Java版本的基础上启动新的服务。
但是,Java 11的基本Docker映像比Java 8的等效映像要大得多:
openjdk:8-jre-alpine:84 MBopenjdk:11-jre-slim:283 MB(我只考虑使用https://hub.docker.com/_/openjdk/和,这是每个Java版本最轻量级的映像。)
更深入的挖掘揭示了以下“事物”:
openjdk:11-jre-slim图像使用基本图像debian:sid-slim。这就带来了两个问题:- this is 60 MB larger than `alpine:3.8`
- the [Debian `sid`](https://www.debian.org/releases/sid/) versions are unstable
openjdk-11-jre-headless包比openjdk8-jre (运行中的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.8OpenJDK/jre/lib/
- `openjdk:11-jre-slim`:du -sh /usr/lib/jvm/java-11-OpenJDK-AMD 64/lib/179 m/usr/lib/jvm/java-11-openjdk 64/lib/
更进一步,我发现了这种沉重的“根源”--它是JDK的modules文件:
ls /usr/lib/jvm/java-11-openjdk-amd64/lib/modules 135 M /usr/lib/jvm/java-11-openjdk-amd64/lib/modules
所以,现在出现的问题是:
alpine不再被用作Java11瘦图像的基本映像?- What is this _modules_ file which brings 135 MB in OpenJDK 11?
UPD:作为应对这些挑战的解决方案,我们可以使用以下答案:Java 11应用程序作为码头映像
发布于 2018-11-19 22:11:04
为什么
alpine不再被用作Java11瘦图像的基本映像?
这是因为,可悲的是,目前还没有为阿尔卑斯山建立官方稳定的OpenJDK 11。
阿尔卑斯使用的是musl,而不是大多数Linuxes使用的标准glibc,这意味着JVM必须与musl兼容,以支持香草阿尔卑斯。musl OpenJDK端口是在OpenJDK的波尔托拉项目下开发的。
OpenJDK 11页概述了当前的状态:
以前在此页面上可用的Alpine构建在JDK 11 GA中已被删除。它没有准备好生产,因为它还没有经过足够彻底的测试,不足以被认为是一个GA构建。请使用早期访问的JDK 12阿尔卑斯Linux构建代替它。
阿尔卑斯目前唯一稳定的OpenJDK版本是IcedTea项目提供的7和8版本。
然而,如果你愿意考虑的不是官方的OpenJDK,那么阿祖尔祖鲁 OpenJDK提供了一个引人注目的替代方案:
有关支持可用性和路线图,请参见Azul支援路线图。
更新,3/6/19:到昨天为止,openjdk11在高山存储库中可用!它可以在阿尔卑斯山上被抓取,使用:
apk --no-cache add openjdk11该包基于jdk11u OpenJDK分支,加上来自Portola项目的移植修复,由下面的按下引入。非常感谢阿尔卑斯队。
为什么LTS Java映像使用不稳定的sid版本?
这是一个公平的问题/要求。实际上,在稳定的Debian版本上提供Java 11是公开的:
https://github.com/docker-library/openjdk/issues/237
更新,26/12/18:这个问题已经解决了,现在OpenJDK 11苗条图像是基于stretch-backports OpenJDK 11的,这是最近发布的(PR链接)。
为什么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的大小(它们应该占用大约80 up的总和)。
发布于 2020-10-15 11:44:03
如果您只考虑官方映像,并且您的目标是使用可用的较小的JRE映像,那么我建议您查看 OpenJDK openjdk:11-jre-slim-buster,它仅为69.2MB。
发布于 2019-07-22 11:14:23
至于07.2019,https://adoptopenjdk.net/对Java 11有正式的高山支持:
但是,模块(jmods,jlink)在组装最小应用程序时仍然需要考虑。
注意事项:苗条图像不包含某些模块(比如java.sql) --它们被明确排除在外(https://github.com/AdoptOpenJDK/openjdk-docker/blob/21b8393b9c23f94d6921a56cce27b026537c6ca2/11/jdk/alpine/slim-java.sh#L233)
https://stackoverflow.com/questions/53375613
复制相似问题