Java 11 wird als neueste LTS-Version angekündigt. Wir versuchen also, neue Dienste basierend auf dieser Java-Version zu starten.
Das Basis-Docker-Image für Java 11 ist jedoch viel größer als das Äquivalent für Java 8:
openjdk:8-jre-alpine
: 84 MBopenjdk:11-jre-slim
: 283 MB
(Ich betrachte nur das offizielle OpenJDK und die leichtesten Images für jede Java-Version.)
Beim tieferen Graben wurden die folgenden "Dinge" entdeckt:
Das
openjdk:11-jre-slim
Bild verwendet das Basisbilddebian:sid-slim
. Dies bringt 2 Probleme mit sich:das ist 60 MB größer als
alpine:3.8
Die Debian-
sid
Versionen sind instabil
Das
openjdk-11-jre-headless
im Image installierte Paket ist dreimal größer alsopenjdk8-jre
(innerhalb des laufenden Docker-Containers):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/
Als ich tiefer ging, entdeckte ich die "Wurzel" dieser Schwere - es ist die
modules
Datei des JDK:# ls -lhG /usr/lib/jvm/java-11-openjdk-amd64/lib/modules 135M /usr/lib/jvm/java-11-openjdk-amd64/lib/modules
Nun also die Fragen, die kamen:
Warum wird es
alpine
nicht mehr als Basis-Image für schlanke Java 11-Images verwendet?Warum wird die instabile Sid- Version für LTS-Java-Images verwendet?
Warum ist das schlanke / kopflose / JRE-Paket für OpenJDK 11 im Vergleich zum ähnlichen OpenJDK 8-Paket so groß?
- Was ist diese Moduldatei , die 135 MB in OpenJDK 11 bringt?
UPD : Als Lösung für diese Herausforderungen könnte man diese Antwort verwenden: Java 11-Anwendung als Docker-Image
Antworten:
Das liegt daran, dass es derzeit leider keinen offiziellen stabilen OpenJDK 11-Build für Alpine gibt.
Alpine verwendet musl libc im Gegensatz zu dem Standard-glibc, das von den meisten Linux-Anbietern verwendet wird. Dies bedeutet, dass eine JVM mit musl libc kompatibel sein muss, um Vanilla Alpine zu unterstützen. Der musl OpenJDK-Port wird im Rahmen des OpenJDK- Portola- Projekts entwickelt.
Der aktuelle Status ist auf der OpenJDK 11-Seite zusammengefasst :
Die einzigen stabilen OpenJDK-Versionen für Alpine sind derzeit 7 und 8, die vom IcedTea- Projekt bereitgestellt werden .
Wenn Sie jedoch bereit sind, andere als das offizielle OpenJDK in Betracht zu ziehen, bietet Azul's Zulu OpenJDK eine überzeugende Alternative:
Informationen zur Verfügbarkeit und Roadmap des Supports finden Sie unter Azul-Support-Roadmap .
Update, 06.03.19: Ab gestern
openjdk11
in alpinen Repositories verfügbar! Es könnte auf Alpine gepackt werden mit:Das Paket basiert auf dem
jdk11u
OpenJDK-Zweig sowie portierten Fixes aus dem Projekt Portola, die mit der folgenden PR eingeführt wurden . Ein großes Lob und ein großes Dankeschön an das Alpine Team.Das ist eine faire Frage / Anfrage. Es gibt tatsächlich ein offenes Ticket für die Bereitstellung von Java 11 für eine stabile Debian-Version:
https://github.com/docker-library/openjdk/issues/237
Update, 26.12.18: Das Problem wurde behoben, und jetzt basiert das schlanke OpenJDK 11-Image auf
stretch-backports
OpenJDK 11, das kürzlich verfügbar gemacht wurde ( PR-Link ).Java 9 führte das Modulsystem ein, ein neuer und verbesserter Ansatz zum Gruppieren von Paketen und Ressourcen im Vergleich zu JAR-Dateien. Dieser Artikel von Oracle bietet eine sehr detaillierte Einführung in diese Funktion:
https://www.oracle.com/corporate/features/understanding-java-9-modules.html
Die
modules
Datei bündelt alle Module, die mit der JRE geliefert werden. Die vollständige Liste der Module kann mit gedruckt werdenjava --list-modules
.modules
ist in der Tat eine sehr große Datei, und wie kommentiert, enthält sie alle Standardmodule und ist daher ziemlich aufgebläht.Zu beachten ist jedoch, dass es ersetzt wird
rt.jar
undtools.jar
unter anderem veraltet ist. Wenn Sie also die Größe vonmodules
OpenJDK-Builds vor 9 berücksichtigen, sollten die Größen vonrt.jar
undtools.jar
abgezogen werden (sie sollten zusammen etwa 80 MB aufnehmen). .quelle
Stand 07.2019 https://adoptopenjdk.net/ bietet offizielle alpine Unterstützung für Java 11:
https://github.com/AdoptOpenJDK/openjdk-docker/blob/master/11/jdk/alpine/
https://hub.docker.com/r/adoptopenjdk/openjdk11
Allerdings Module ( jmods ,
jlink
) noch gelten als wenn man zusammenbaut minimal Anwendung.Hinweis : Schlanke Bilder enthalten keine Module (wie
java.sql
) - sie werden explizit ausgeschlossen ( https://github.com/AdoptOpenJDK/openjdk-docker/blob/21b8393b9c23f94d6921a56cce27b026537c6ca2/11/jdk/alpine/slim-java.shL )quelle
https://hub.docker.com/_/openjdk?tab=tags&page=1&name=11.0.7-jre-slim
Im Docker OpenJDK-Repository ist das Bild von Slim JRE 11 kleiner als 70 MB
quelle