Perché l'immagine Docker di base Java 11 è così grande? (openjdk: 11-jre-sottile)
Java 11 è annunciato per essere la versione LTS più recente. Quindi, stiamo cercando di avviare nuovi servizi basati su questa versione Java.
Tuttavia, l'immagine Docker di base per Java 11 è molto più grande dell'equivalente per Java 8:
openjdk:8-jre-alpine
: 84 MBopenjdk:11-jre-slim
: 283 MB
(sto considerando solo il OpenJDK ufficiale e il più leggero immagini per ogni versione Java.)
Scavare più a fondo ha scoperto le seguenti "cose":
-
Il
openjdk:11-jre-slim
image utilizza l'immagine di basedebian:sid-slim
. Questo porta 2 problemi:Questo è 60 MB più grande di
alpine:3.8
-
Il Debian
sid
le versioni sono instabili
-
Il pacchetto
openjdk-11-jre-headless
installato nell'immagine è 3 volte più grande diopenjdk8-jre
(all'interno in esecuzione Contenitore finestra mobile):-
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/
Andando più in profondità ho scoperto la "radice" di questa pesantezza-è il file
modules
del JDK:# ls -lhG /usr/lib/jvm/java-11-openjdk-amd64/lib/modules 135M /usr/lib/jvm/java-11-openjdk-amd64/lib/modules
-
Quindi, ora le domande che sono venute:
Perché
alpine
non viene più utilizzato come immagine di base per le immagini slim Java 11?Perché viene utilizzata la versione unstable sid per le immagini Java LTS?
-
Perché il pacchetto slim/headless/JRE per OpenJDK 11 è così grande rispetto al pacchetto OpenJDK 8 simile?
- Cos'è questo file modules che porta 135 MB in OpenJDK 11?
UPD: come soluzione per queste sfide si potrebbe usare questa risposta: Applicazione Java 11 come immagine docker
4 answers
Perché
alpine
non viene più utilizzato come immagine di base per le immagini slim Java 11?
Questo perché, purtroppo, non esiste una build ufficiale stabile OpenJDK 11 per Alpine attualmente.
Alpine usa musl libc, al contrario dello standard glibc usato dalla maggior parte dei Linuxes là fuori, il che significa che una JVM deve essere compatibile con musl libc per supportare vanilla Alpine. La porta musl OpenJDK è in fase di sviluppo nell'ambito del progetto Portola di OpenJDK.
Il lo stato attuale è riassunto nella pagina OpenJDK 11 :
La build di Alpine Linux precedentemente disponibile in questa pagina è stata rimossa a partire da JDK 11 GA. Non è pronto per la produzione perché non è stato testato abbastanza a fondo per essere considerato una build GA. Si prega di utilizzare l'accesso anticipato JDK 12 Alpine Linux costruire al suo posto.
Le uniche versioni stabili di OpenJDK per Alpine sono attualmente 7 e 8, fornite dal progetto IcedTea.
Tuttavia - se siete disposti a prendere in considerazione altro che l'OpenJDK ufficiale, Azul Zulu OpenJDK offre un'alternativa convincente:
- Supporta Java 11 su Alpine musl (versione 11.0.2 al momento della scrittura);
- È una build OpenJDK certificata, verificata utilizzando la suite di conformità OpenJDK TCK;
- È gratuito, open source e docker pronto ( Dockerhub).
Per la disponibilità del supporto e la tabella di marcia, vedere Supporto Azul tabella di marcia.
Aggiornamento, 3/6/19: A partire da ieri, openjdk11
è disponibile nei repository Alpine! Potrebbe essere afferrato su Alpine usando:
apk --no-cache add openjdk11
Il pacchetto è basato sul ramo jdk11u
OpenJDK più correzioni portate dal progetto Portola, introdotto con il seguente PR. Complimenti e grandi ringraziamenti alla squadra alpina.
Perché la versione unstable sid viene utilizzata per le immagini Java LTS?
Questa è una domanda / richiesta giusta. In realtà c'è un ticket aperto per fornire Java 11 su un rilascio Debian stabile:
https://github.com/docker-library/openjdk/issues/237
Update, 26/12/18: Il problema è stato risolto e ora l'immagine slim OpenJDK 11 è basata su stretch-backports
OpenJDK 11 che è stata recentemente resa disponibile (PR link).
Perché il pacchetto slim/headless/JRE per OpenJDK 11 è così grande rispetto al pacchetto OpenJDK 8 simile? Cos'è questo moduli file che porta 135 MB in OpenJDK 11?
Java 9 ha introdotto il sistema di moduli, che è un approccio nuovo e migliorato per raggruppare pacchetti e risorse, rispetto ai file jar. Questo articolo di Oracle fornisce un'introduzione molto dettagliata a questo feature:
https://www.oracle.com/corporate/features/understanding-java-9-modules.html
Il file modules
raggruppa tutti i moduli forniti con JRE. L'elenco completo dei moduli potrebbe essere stampato con java --list-modules
. modules
è davvero un file molto grande, e come commentato, contiene tutti i moduli standard, ed è quindi abbastanza gonfio.
Una cosa da notare è che sostituisce rt.jar
e tools.jar
che sono diventati deprecati, tra le altre cose, quindi quando si tiene conto della dimensione di modules
quando si confrontano con le build OpenJDK pre-9, le dimensioni di rt.jar
e tools.jar
dovrebbero essere sottratte (dovrebbero occupare circa 80 MB combinati).
Come per 07.2019 https://adoptopenjdk.net / ha il supporto ufficiale di Alpine per Java 11:
Tuttavia, i moduli ( jmods, jlink
) ancora deve essere considerato quando si assembla applicazione minima.
Nota: le immagini slim non contengono alcuni moduli (come java.sql
) - sono esclusi esplicitamente (https://github.com/AdoptOpenJDK/openjdk-docker/blob/21b8393b9c23f94d6921a56cce27b026537c6ca2/11/jdk/alpine/slim-java.sh#L233)
Se stai considerando solo Immagini ufficiali e il tuo obiettivo è usare l'immagine JRE più piccola disponibile, ti suggerisco di guardare l'immagine OpenJDK ufficiale openjdk:11-jre-slim-buster
che è solo 69.2 MB.
Https://hub.docker.com/_/openjdk?tab=tags&page=1&name=11.0.7-jre-slim
Nel repository docker openjdk, l'immagine slim jre 11 è inferiore a 70 mb