Why is the Java 11 base Docker image so large? (openjdk:11-jre-slim)
宣布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 。这带来了两个问题:-
比
alpine:3.8 大60 MB -
Debian
sid 版本不稳定
-
-
镜像中安装的
openjdk-11-jre-headless 软件包是openjdk8-jre 的3倍(在运行中的Docker容器内部):-
openjdk:8-jre-alpine :1
2/ # 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 :1
2# du -sh /usr/lib/jvm/java-11-openjdk-amd64/lib/
179M /usr/lib/jvm/java-11-openjdk-amd64/lib/更深入地讲,我发现了这种繁琐的"根"-它是JDK的
modules 文件:1
2# 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的这个模块文件是什么?
UPD:作为应对这些挑战的解决方案,可以使用以下答案:Java 11应用程序作为docker映像
Why is
alpine not used any more as a base image for Java 11 slim images?
不幸的是,这是因为目前没有针对Alpine的官方稳定的OpenJDK 11构建。
与目前大多数Linux使用的标准glibc相比,Alpine使用musl libc,这意味着JVM必须与musl libc兼容才能支持香草Alpine。在OpenJDK的Portola项目下正在开发Musl OpenJDK端口。
当前状态汇总在OpenJDK 11页面上:
-
The Alpine Linux build previously available on this page was removed as of JDK 11 GA. It’s not production-ready because it hasn’t been tested thoroughly enough to be considered a GA build. Please use the early-access JDK 12 Alpine Linux build in its place.
IcedTea项目提供的Alpine唯一稳定的OpenJDK版本是7和8。
但是,如果您愿意考虑使用官方OpenJDK之外的其他东西,则Azul的Zulu OpenJDK提供了一种引人注目的替代方案:
- 它支持Alpine musl上的Java 11(撰写本文时为11.0.2版);
- 它是经过认证的OpenJDK构建,已使用OpenJDK TCK合规套件进行了验证;
- 它是免费的,开源的并且可以在Dockerhub上使用(Dockerhub)。
有关支持可用性和路线图,请参阅Azul支持路线图。
更新,3/6/19:截至昨天,高山存储库中提供了
1 | apk --no-cache add openjdk11 |
该软件包基于
Why is the unstable sid version used for LTS Java images?
这是一个公平的问题/要求。实际上有一个开放的票证可以在稳定的Debian版本上提供Java 11:
https://github.com/docker-library/openjdk/issues/237
更新,2018年18月12日:问题已解决,现在OpenJDK 11超薄映像基于最近可用的
Why is the slim/headless/JRE package for OpenJDK 11 so large compared to the similar OpenJDK 8 package? What is this modules file which brings 135 MB in OpenJDK 11?
Java 9引入了模块系统,与jar文件相比,这是一种对包和资源进行分组的新的改进方法。 Oracle的这篇文章对此功能进行了非常详细的介绍:
https://www.oracle.com/corporate/features/understanding-java-9-modules.html
但是要注意的一件事是,它取代了已弃用的
从2019年7月开始https://adoptopenjdk.net/拥有Alpine对Java 11的官方支持:
-
https://github.com/AdoptOpenJDK/openjdk-docker/blob/master/11/jdk/alpine/
-
https://hub.docker.com/r/adoptopenjdk/openjdk11
但是,当组装最小的应用程序时,仍应考虑模块(jmods,
注意:纤细图像不包含某些模块(例如