Java 11 被宣布为最新的 LTS 版本。因此,我们正在尝试基于这个 Java 版本启动新服务。
然而,Java 11 的基础 Docker 镜像比 Java 8 的相应镜像要大得多:
openjdk:8-jre-alpine
:84 MBopenjdk:11-jre-slim
:283 MB
(我只考虑每个 Java 版本中官方 OpenJDK和最轻量级的镜像。)
进一步挖掘发现以下“问题”:
openjdk:11-jre-slim
镜像使用了基础镜像debian:sid-slim
。这带来了两个问题:这比
alpine:3.8
大 60 MB。Debian
sid
版本是不稳定的。
镜像中安装的
openjdk-11-jre-headless
包(在运行 Docker 容器内)比openjdk8-jre
大3倍:openjdk:8-jre-alpine
:
openjdk:11-jre-slim/ # du -hs /usr/lib/jvm/java-1.8-openjdk/jre/lib/ 57.5M /usr/lib/jvm/java-1.8-openjdk/jre/lib/
深入研究后,我发现这种沉重感的“根源”——就在JDK的# du -sh /usr/lib/jvm/java-11-openjdk-amd64/lib/ 179M /usr/lib/jvm/java-11-openjdk-amd64/lib/
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精简映像的基础镜像?为什么LTS Java映像使用不稳定的sid版本?
为什么OpenJDK 11的精简/无头/JRE包与类似的OpenJDK 8包相比如此之大?
- modules文件是什么,在OpenJDK 11中占据了135 MB?
更新: 对于这些挑战的解决方案,可以使用这个答案: Java 11 application as docker image