为什么 Java 11 基础 Docker 镜像这么大?(openjdk:11-jre-slim)
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
image 使用 base image 。这带来了2个问题:debian:sid-slim
这比
alpine:3.8
Debian
sid
版本是不稳定的
-
映像中安装的包比(在正在运行的 Docker 容器中)大 3 倍:
openjdk-11-jre-headless
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/
更深入地了解了这种沉重感的“根源” - 它是JDK的文件:
modules
# ls -lhG /usr/lib/jvm/java-11-openjdk-amd64/lib/modules 135M /usr/lib/jvm/java-11-openjdk-amd64/lib/modules
-
所以,现在出现了问题:
为什么不再用作 Java 11 精简映像的基础映像?
alpine
为什么不稳定的 sid 版本用于 LTS Java 映像?
-
为什么OpenJDK 11的超薄/无头/JRE封装与类似的OpenJDK 8封装相比如此之大?
- 这个模块文件是什么,它带来了135 MB在OpenJDK 11?
UPD:作为应对这些挑战的解决方案,可以使用这个答案:Java 11应用程序作为docker映像