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 image debian: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 than openjdk8-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?
UPD: as a solutions for these challenges one could use this answer: Java 11 application as docker image
openjdk:<version>-slimIt only contains the minimal packages needed to run Java. Unless you are working in an environment where only the openjdk image will be deployed and you have space constraints, we highly recommend using the default image of this repository. Follow this answer to receive notifications.
JDK 11 is the open-source reference implementation of version 11 of the Java SE Platform as specified by by JSR 384 in the Java Community Process.
What is OpenJDK? OpenJDK (Open Java Development Kit) is a free and open source implementation of the Java Platform, Standard Edition (Java SE). OpenJDK is the official reference implementation of Java SE since version 7. wikipedia.org/wiki/OpenJDK.
When creating a Docker image, we should only assign the necessary resources to function correctly. This means that we should start by using an appropriate Java Runtime Environment (JRE) for your production image and not the complete Java Development Kit (JDK).
Why is
alpine
not used any more as a base image for Java 11 slim images?
That's because, sadly, there is no official stable OpenJDK 11 build for Alpine currently.
Alpine uses musl libc, as opposed to the standard glibc used by most Linuxes out there, which means that a JVM must be compatible with musl libc for supporting vanilla Alpine. The musl OpenJDK port is being developed under OpenJDK's Portola project.
The current status is summarized on the OpenJDK 11 page:
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.
The only stable OpenJDK versions for Alpine currently are 7 and 8, provided by the IcedTea project.
However - if you're willing to consider other than the official OpenJDK, Azul's Zulu OpenJDK offers a compelling alternative:
For support availability and roadmap, see Azul support roadmap.
Update, 3/6/19: As of yesterday, openjdk11
is available in Alpine repositories! It could be grabbed on Alpine using:
apk --no-cache add openjdk11
The package is based on the jdk11u
OpenJDK branch plus ported fixes from project Portola, introduced with the following PR. Kudos and huge thanks to the Alpine team.
Why is the unstable sid version used for LTS Java images?
That's a fair question / request. There's actually an open ticket for providing Java 11 on a stable Debian release:
https://github.com/docker-library/openjdk/issues/237
Update, 26/12/18: The issue has been resolved, and now the OpenJDK 11 slim image is based on stretch-backports
OpenJDK 11 which was recently made available (PR link).
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 introduced the module system, which is a new and improved approach for grouping packages and resources, compared to jar files. This article from Oracle gives a very detailed introduction to this feature:
https://www.oracle.com/corporate/features/understanding-java-9-modules.html
The modules
file bundles all modules shipped with the JRE. The complete list of modules could be printed with java --list-modules
. modules
is indeed a very large file, and as commented, it contains all standard modules, and it is therefore quite bloated.
One thing to note however is that it replaces rt.jar
and tools.jar
which became deprecated, among other things, so when accounting for the size of modules
when comparing to pre-9 OpenJDK builds, the sizes of rt.jar
and tools.jar
should be subtracted (they should take up some 80MB combined).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With