Java11被宣布为最新的LTS版本.因此,我们正在try 基于这个Java版本启动新的服务.
但是,Java 11的基本Docker映像比Java 8的等效映像大得多:
openjdk:8-jre-alpine
:84MBopenjdk:11-jre-slim
:283MB
(我只考虑每个Java版本的official OpenJDK和the most lightweight个图像.)
深入挖掘发现了以下"东西":
-
openjdk:11-jre-slim
图像使用基本图像debian:sid-slim
.这带来了两个问题:这是大于
alpine:3.8
的60 MBDebian
sid
个版本不稳定
-
图中安装的
openjdk-11-jre-headless
包比openjdk8-jre
包大3 times larger(在运行的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
不再用作Java11瘦图像的基础图像?为什么不稳定的sid版本用于LTS Java映像?
-
为什么OpenJDK 11的slim/headless/JRE包与类似的OpenJDK 8包相比如此之大?
- 在OpenJDK 11中,这modules个文件带来135MB的空间是什么?
作为这些挑战的解决方案,我们可以用这个答案:Java 11 application as docker image