Java 11 is announced to be the most recent LTS version. So, we’re trying to start new services based on this Java version.
However, the base Docker image for Java 11 is much larger than the equivalent for Java 8:
-
openjdk:8-jre-alpine
: 84 MB -
openjdk:11-jre-slim
: 283 MB
(I’m considering only the official OpenJDK and the most lightweight images for each Java version.)
Deeper digging uncovered the following “things”:
-
the
openjdk:11-jre-slim
image uses the base imagedebian:sid-slim
. This brings 2 issues:-
this is 60 MB larger than
alpine:3.8
-
the Debian
sid
versions are unstable
-
-
the
openjdk-11-jre-headless
package installed in the image is 3 times larger thanopenjdk8-jre
(inside running Docker container):-
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/
Going deeper I discovered the “root” of this heaviness – it’s the
modules
file of the JDK:# ls -lhG /usr/lib/jvm/java-11-openjdk-amd64/lib/modules 135M /usr/lib/jvm/java-11-openjdk-amd64/lib/modules
-
So, now the questions which came:
-
Why is
alpine
not used any more as a base image for Java 11 slim images? -
Why is the unstable sid version used for LTS Java images?
-
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?
UPD: as a solutions for these challenges one could use this answer: Java 11 application as docker image