mercredi 28 septembre 2022

Vous saviez pour OpenJDK et Docker™?

Jusqu'à la version 11 de la JDK, il était possible d'utiliser une image "fine" pour empaqueter les applications Java: openjdk:11-jre-slim. Mais depuis, ça se complique car il n'existe plus d'image officielle OpenJDK uniquement centrée sur la JRE.
La conséquence majeure: on se retrouve alors avec une image d'environ 400 MiB pour enrober une API dont le JAR n'en fait que 70; pas cool. On dirait un rapport Charge Utile / Masse Totale digne d'une fusée Arianne. Toute cela parce que:

  • l'image embarque l'ensemble du JDK; incluant le compilateur ainsi qu'un tas d'autres trucs inutiles au runtime
  • le concept de JRE n'existe pas au niveau de l'OpenJDK, c'est un "détail" laissé à la discretion des distributeurs du JDK

J'ai retenu deux solutions[1] à ce problème :

  1. la plus simple: changer d'image de base pour passer sur celle d'une distribution livrant une version JRE (comme docker.io/library/eclipse-temurin:18-jre-alpine par exemple ~170 MiB, ou une autre)
  2. la plus fun: utiliser jdeps et jlink pour fabriquer un JRE custom sur base de l'OpenJDK

On explorera ici la deuxième solution : non pas parce que c'est la plus facile, mais parce que c'est la plus compliquée 🙂 (… et parce que la première, vous la connaissiez sûrement déjà)

mise à jour du 29/03/2024:
Un projet d'exemple est disponible ici montrant un exemple d'usage production ready.