web-dev-qa-db-fra.com

Pourquoi l’image de base Docker Java 11 est-elle si grande? (openjdk: 11-jre-slim)

Java 11 est annoncé comme étant la version la plus récente de LTS. Nous essayons donc de démarrer de nouveaux services basés sur cette version Java.

Toutefois, l’image de base de Docker pour Java 11 est beaucoup plus grande que l’équivalent pour Java 8:

(Je considère uniquement les OpenJDK officiel et les images les plus légères pour chaque version Java.)

Des recherches plus approfondies ont permis de découvrir les "choses" suivantes:

  • la openjdk:11-jre-slim image utilise l'image de base _debian:sid-slim_. Cela soulève deux problèmes:

    • 60 Mo plus grand que _Alpine:3.8_

    • les Debian sid les versions sont instables

  • le package _openjdk-11-jre-headless_ installé dans l'image est trois fois plus grand que _openjdk8-jre_ (à l'intérieur du conteneur Docker en cours d'exécution):

    • _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 fichier modules du JDK:

      _# ls -lhG /usr/lib/jvm/Java-11-openjdk-AMD64/lib/modules
      135M    /usr/lib/jvm/Java-11-openjdk-AMD64/lib/modules
      _

Alors, maintenant les questions qui sont venues:

  • Pourquoi Alpine n'est-il plus utilisé comme image de base pour Java 11 images minces?

  • Pourquoi la version unstable sid est-elle utilisée pour les images LTS Java?

  • Pourquoi le package slim/headless/JRE pour OpenJDK 11 est-il si volumineux par rapport au package OpenJDK 8 similaire?

    • Qu'est-ce que c'est ce fichier modules qui apporte 135 Mo dans OpenJDK 11?

UPD: pour répondre à ces défis, on pourrait utiliser cette réponse: application Java 11 en tant qu'image docker

95
radistao

Pourquoi Alpine n'est-il plus utilisé comme image de base pour Java 11 images minces?

En effet, il n’existe actuellement aucune version stable officielle d’OpenJDK 11 pour Alpine.

Alpine utilise musl libc, contrairement à la norme glibc utilisée par la plupart des Linux, ce qui signifie qu'une machine virtuelle doit être compatible avec musl libc pour la prise en charge de Vanilla Alpine. Le port Musl OpenJDK est en cours de développement dans le cadre du projet Portola d’OpenJDK.

Le statut actuel est résumé sur le 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 pouvoir être considéré comme une version GA. Veuillez utiliser la version JDK 12 Alpine Linux à accès anticipé à sa place.

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

Cependant - si vous êtes prêt à envisager un autre logiciel que l'OpenJDK officiel, Zulu d'Azul OpenJDK offre une alternative convaincante:

  • Il supporte Java 11 sur Alpine musl (version 11.0.2 à la date de rédaction);
  • Il s'agit d'une version certifiée OpenJDK vérifiée à l'aide de la suite de conformité OpenJDK TCK.
  • C'est gratuit, open source et docker ready ( Dockerhub ).

Pour connaître la disponibilité et la feuille de route de la maintenance, voir Feuille de route de la maintenance Azul .

Mise à jour, 3/6/19: Depuis hier, openjdk11 est disponible dans les référentiels Alpine! Il pourrait être saisi sur Alpine en utilisant:

apk --no-cache add openjdk11

Le package est basé sur la branche jdk11u OpenJDK plus les correctifs portés du projet Portola, introduits avec le texte suivant PR . Bravo et un grand merci à l'équipe alpine.

Pourquoi la version unstable sid est-elle utilisée pour les images LTS Java?

C'est une bonne question/demande. Il existe actuellement un ticket 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 OpenJDK 11 slim est basée sur stretch-backports OpenJDK 11 qui a récemment été mis à disposition ( lien PR ).

Pourquoi le package slim/headless/JRE pour OpenJDK 11 est-il si volumineux par rapport au package OpenJDK 8 similaire? Qu'est-ce que c'est ce fichier modules qui apporte 135 Mo dans OpenJDK 11?

Java 9 a introduit le système de modules, une approche nouvelle et améliorée pour le regroupement de packages et de ressources, par rapport aux fichiers jar. Cet article d'Oracle donne une introduction très détaillée à cette fonctionnalité:
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 peut être imprimée avec Java --list-modules. modules est en effet un fichier très volumineux. Comme il est commenté, il contient tous les modules standard et est donc assez volumineux.

Une chose à noter cependant, c'est qu'il remplace rt.jar et tools.jar qui sont devenus obsolètes, entre autres choses. Ainsi, lorsque vous tenez compte de la taille de modules lors de la comparaison avec les versions OpenJDK antérieures à 9, les tailles de rt.jar et tools.jar devraient être soustraits (ils devraient occuper environ 80 Mo combinés).

116
valiano

comme pour 07.2019 https://adoptopenjdk.net/ dispose du support officiel Alpine pour Java 11:

Cependant, les modules ( jmods , jlink) doivent toujours être pris en compte lorsqu’une application minimale est assemblée.

Remarque : les images minces ne contiennent pas certains modules (comme Java.sql) - ils sont exclus explicitement ( https://github.com/AdoptOpenJDK/openjdk-docker/blob/21b8393b9c23f94d6921, 56cce27b026537c6ca2/11/jdk/Alpine/slim-Java.sh#L2

2
radistao