Pourquoi l'image Docker de base Java 11 est-elle si grande? (openjdk: 11-jre-mince)
Java 11 est annoncé pour être la version LTS la plus récente. Nous essayons donc de démarrer de nouveaux services basés sur cette version Java.
Cependant, l'image Docker de base pour Java 11 est beaucoup plus grande que l'équivalent pour Java 8:
openjdk:8-jre-alpine
: 84 MOopenjdk:11-jre-slim
: 283 MO
(je suis en considérant uniquement la officiel OpenJDK et la plupart des léger images pour chaque version de Java.)
Creuser plus profondément a découvert les "choses" suivantes:
-
Le
openjdk:11-jre-slim
image utilise l'image de basedebian:sid-slim
. Cela apporte 2 problèmes:C'est 60 MO supérieure à
alpine:3.8
Le Debian
sid
les versions sont instables
-
Le paquet
openjdk-11-jre-headless
installé dans l'image est 3 fois plus grand queopenjdk8-jre
(à l'intérieur en cours d'exécution Conteneur Docker):-
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/
En allant plus loin, j'ai découvert la "racine" de cette lourdeur - c'est le
modules
fichier du JDK:# ls -lhG /usr/lib/jvm/java-11-openjdk-amd64/lib/modules 135M /usr/lib/jvm/java-11-openjdk-amd64/lib/modules
-
Donc, maintenant les questions qui sont venues:
Pourquoi
alpine
n'est-il plus utilisé comme image de base pour les images minces Java 11?Pourquoi est instable sid version utilisée pour les images Java LTS?
-
Pourquoi le package slim/headless/JRE pour OpenJDK 11 est-il si grand par rapport au package OpenJDK 8 similaire?
- Quel est ce fichier modules qui apporte 135 Mo dans OpenJDK 11?
UPD : comme solution à ces défis, on pourrait utiliser cette réponse: Java 11 application as docker image
4 answers
Pourquoi
alpine
n'est-il plus utilisé comme image de base pour les images minces Java 11?
C'est parce que, malheureusement, il n'y a pas d'écurie officielle OpenJDK 11 construire pour Alpine actuellement.
Alpine utilise musl libc, par opposition à la glibc standard utilisée par la plupart des Linuxes, ce qui signifie qu'une JVM doit être compatible avec musl libc pour supporter vanilla Alpine. Le port musl OpenJDK est développé dans le cadre du projet Portola d'OpenJDK.
Le l'état actuel est résumé sur la page OpenJDK 11 :
Les seules versions stables d'OpenJDK pour Alpine sont actuellement 7 et 8, fournies par le projet IcedTea.La version Alpine Linux précédemment disponible sur cette page a été supprimée à partir de JDK 11 GA. Il n'est pas prêt pour la production car il n'a pas été suffisamment testé pour être considéré comme une version GA. Veuillez utiliser la version JDK 12 Alpine Linux en accès anticipé à sa place.
Cependant - si vous êtes prêt à considérer autre chose que l'OpenJDK officiel, Zulu d'Azul OpenJDK offre une alternative convaincante:
- Il supporte Java 11 sur Alpine musl (version 11.0.2 au moment de la rédaction); Il s'agit d'une version OpenJDK certifiée, vérifiée à l'aide de la suite de conformité OpenJDK TCK;
- , Il est gratuit, open source et docker prêt (Dockerhub).
Pour la disponibilité du support et la feuille de route, voir Azul support feuille de route.
Mise à jour, 3/6/19: Depuis hier, openjdk11
est disponible dans les dépôts alpins! Il pourrait être saisi sur Alpine en utilisant:
apk --no-cache add openjdk11
Le paquet est basé sur la branche jdk11u
OpenJDK plus les corrections portées du projet Portola, introduites avec le PR suivant. Bravo et un grand merci à l'équipe Alpine.
Pourquoi la version unstable sid est-elle utilisée pour les images Java LTS?
C'est une question / demande juste. Il y a en fait un ticket ouvert pour fournir Java 11 sur une version stable de Debian:
https://github.com/docker-library/openjdk/issues/237
Mise à jour, 26/12/18: Le problème a été résolu, et maintenant l'image slim d'OpenJDK 11 est basée sur stretch-backports
OpenJDK 11 qui a été récemment rendu disponible (PR link).
Pourquoi le package slim/headless/JRE pour OpenJDK 11 est-il si grand par rapport au package OpenJDK 8 similaire? Qu'est-ce que ce modules fichier qui apporte 135 Mo dans OpenJDK 11?
Java 9 a introduit le système de modules, qui est une approche nouvelle et améliorée pour regrouper les paquets et les ressources, par rapport aux fichiers jar. Cet article d'Oracle donne une introduction très détaillée à cela feature:
https://www.oracle.com/corporate/features/understanding-java-9-modules.html
Le fichier modules
regroupe tous les modules fournis avec le JRE. La liste complète des modules pourrait être imprimé avec java --list-modules
. modules
est en effet un fichier très volumineux, et comme commenté, il contient tous les modules standard, et il est donc assez gonflé.
Une chose à noter cependant est qu'il remplace rt.jar
et tools.jar
qui sont devenus obsolètes, entre autres choses, donc lors de la prise en compte de la taille de modules
lors de la comparaison avec les versions OpenJDK pré-9, les tailles de rt.jar
et tools.jar
doivent être soustraites (elles devraient prendre environ 80 Mo combinés).
Comme pour 07.2019 https://adoptopenjdk.net / a le support officiel d'Alpine pour Java 11:
Cependant, les modules (jmods, jlink
) still doit être considéré lorsque l'on assemble une application minimale.
Remarque: les images slim {[22] } ne contiennent pas certains modules (comme java.sql
) - ils sont explicitement exclus (https://github.com/AdoptOpenJDK/openjdk-docker/blob/21b8393b9c23f94d6921a56cce27b026537c6ca2/11/jdk/alpine/slim-java.sh#L233)
Si vous ne considérez que des Images officielles et que votre objectif est d'utiliser la plus petite image JRE disponible, je vous suggère de regarder la OpenJDK officielle image openjdk:11-jre-slim-buster
qui ne fait que 69,2 Mo.
Https://hub.docker.com/_/openjdk?tab=tags&page=1&name=11.0.7-jre-slim
Dans le référentiel docker openjdk, l'image slim jre 11 est inférieure à 70 mo