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:

(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 base debian: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 di openjdk8-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

Author: radistao, 2018-11-19

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 jdk11uOpenJDK 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).

 186
Author: valiano, 2020-03-13 20:58:00

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)

 10
Author: radistao, 2019-07-22 11:14:23

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.

 4
Author: davide79, 2020-10-15 11:44:03

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

 0
Author: Javier Aviles, 2020-05-26 08:06:58