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:

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

Author: radistao, 2018-11-19

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 :

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.

Les seules versions stables d'OpenJDK pour Alpine sont actuellement 7 et 8, fournies par le projet IcedTea.

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

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

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)

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

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.

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

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

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