[JAVA] Puisque l'image dokcer (1 Go) d'OpenJDK11 est grande, créez une petite image (85 Mo) avec alpine linux + jlink.

introduction

L'image docker de openjdk 11 est disponible sur le répertoire officiel du hub docker.

https://hub.docker.com/_/openjdk/

Mais ... je suis un peu inquiet d'utiliser ça

Il ya un problème. Je veux le réduire. Alors j'ai essayé à quel point ça pouvait être petit!

supposition

--Java Flight Recorder fonctionne

résultat

** 1 Go → 85 Mo et peut être compressé à moins de 1/10: sourire: ** Personnellement, je suis très satisfait.

Le résultat de la vérification de la taille avec les «images docker» est le suivant.

Type d'image Utilisez jlink size
openjdk:11-jdk ne pas faire 1GB
openjdk:11-jdk Faire 468MB
Alpinelinux original ne pas faire 336MB
Alpinelinux original Faire 84.6MB

jdk11 est la version ea. Je pense qu'il sera possible de faire une petite image avec l'image officielle de openjdk 11 correctement. Alpinelinux d'origine,  https://hub.docker.com/r/hirokimatsumoto/alpine-openjdk-11/ est.

problème

Décrit le problème de l'image officielle d'OpenJDK 11 en détail.

Grande taille d'image

$ sudo docker images |grep jdk
docker.io/openjdk                            11-jdk   f684efd78557  2 weeks ago         979 MB
$

L'enregistreur de vol ne fonctionne pas sur jre, donc je veux utiliser jdk ... c'est un peu trop gros. Référence: [Qiita --OpenJDK11-JRE-SLIM ne fonctionne pas avec l'enregistreur de vol. ](Https://qiita.com/hrk-matsumoto/items/ca1a6d80f3984c975c20#openjdk11-jre-slim%E3%81%98%E3%82%83flightrecorder%E3%81%AF%E5%8B%95%E3% 81% 8D% E3% 81% BE% E3% 81% 9B% E3% 82% 93)

Dans openjdk 11 (officiel), il ne devient pas plus petit même si vous utilisez jlink.

Le problème suivant résout également le même problème. https://github.com/docker-library/openjdk/issues/217

Quand je l'essaie ... Pour une raison quelconque, cela devient environ 400 Mo et la taille de l'image devient environ 450 Mo comme indiqué ci-dessous.

$ docker run -it --rm openjdk:11-jdk /bin/sh
# ls -l /usr/lib/jvm/java-11-openjdk-amd64/lib/server/
total 34944
-rw-r--r-- 1 root root     1322 Jul 27 03:41 Xusage.txt
-r--r--r-- 1 root root 18210816 Jul 27 22:22 classes.jsa
-rw-r--r-- 1 root root    14440 Jul 27 03:41 libjsig.so
-rw-r--r-- 1 root root 17551048 Jul 27 03:41 libjvm.so  #Toujours petit
Essayez de compresser
# jlink \
     --module-path /opt/java/jmods \
     --compress=2 \
     --add-modules java.base,java.logging,jdk.jfr  \
     --no-header-files \
     --no-man-pages \
     --output /opt/jdk-11-mini-runtime
#  ls -l /opt/jdk-11-mini-runtime/lib/server/
total 414452
-rw-r--r-- 1 root root      1322 Aug 14 09:41 Xusage.txt
-rw-r--r-- 1 root root     25384 Aug 14 09:41 libjsig.so
-rw-r--r-- 1 root root 424362808 Aug 14 09:41 libjvm.so #Pourquoi···
#

Je vais réduire la taille de l'image!

Prenons l'approche de l'utilisation de linux alpin, puis de jlink pour le rendre plus petit.

Créez une image pour la version de base de linux alpin.

Les autres peuvent-ils se tenir debout? Je pense que c'est ouvert au public.

image: https://hub.docker.com/r/hirokimatsumoto/alpine-openjdk-11/ docker file: https://hub.docker.com/r/hirokimatsumoto/alpine-openjdk-11/~/dockerfile/

Je suis désolé de ne pas avoir vérifié la somme de contrôle ...

Créez une petite image d'exécution à l'aide de jlink.

Construisez en utilisant la multi-étape.

  1. Sur la base de l'image alpine linux + openjdk 11 créée ci-dessus, créez un petit module d'exécution Java avec jlink.
  2. Créez une image d'Alphine Linux qui est une copie du module d'exécution et du module jar.
FROM hirokimatsumoto/alpine-openjdk-11:latest as jlink-package
# First: generate java runtime module by jlink.

RUN jlink \
     --module-path /opt/java/jmods \
     --compress=2 \
     --add-modules jdk.jfr,jdk.management.agent,java.base,java.logging,java.xml,jdk.unsupported,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument \
     --no-header-files \
     --no-man-pages \
     --output /opt/jdk-11-mini-runtime

# Second: generate run image.
FROM alpine:3.8

ENV JAVA_HOME=/opt/jdk-11-mini-runtime
ENV PATH="$PATH:$JAVA_HOME/bin"

COPY --from=jlink-package /opt/jdk-11-mini-runtime /opt/jdk-11-mini-runtime
COPY target/k8s-jmc-sample-0.1.0-SNAPSHOT.jar /opt/spring-boot/

EXPOSE 30001 7199
CMD java \
    -XX:StartFlightRecording=name=sample,filename=/spring-boot/jfr/sample.jfr,delay=30s,maxage=2h,maxsize=10m,dumponexit=true,settings=/spring-boot/config/profile.jfc \
    -Dcom.sun.management.jmxremote.port=7199 \
    -Dcom.sun.management.jmxremote.rmi.port=7199 \
    -Dcom.sun.management.jmxremote.authenticate=false \
    -Dcom.sun.management.jmxremote.ssl=false \
    -jar /opt/spring-boot/k8s-jmc-sample-0.1.0-SNAPSHOT.jar \
    --server.port=${SPRING_SERVER_PORT} \
    --spring.config.location=/spring-boot/config/application.yaml

L'application en cours d'exécution est https://github.com/h-r-k-matsumoto/k8s-jmc-sample est.

J'étais accro à

L'examen des dépendances d'une application Spring Boot avec jdeps n'est pas précis

Tout d'abord, j'ai utilisé jdeps pour vérifier les modules requis comme indiqué ci-dessous.

> jdeps --list-deps .\target\k8s-jmc-sample-0.1.0-SNAPSHOT.jar
   java.base
   java.logging
>

Même si vous faites un runtime avec ceci ... Au moment de l'exécution, une erreur se produira comme indiqué ci-dessous.

Caused by: java.lang.ClassNotFoundException: java.sql.SQLException
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
        at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:93)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)

Eh bien, je me demande si je ne peux pas bien suivre la pièce auto-configurée à l'intérieur du soufflet à ressort ... C'était ennuyeux, alors  https://dev.solita.fi/2018/01/24/Java9-modules-Spring-Boot-2-Docker.html Je l'ai ajouté de manière appropriée.

référence

Recommended Posts

Puisque l'image dokcer (1 Go) d'OpenJDK11 est grande, créez une petite image (85 Mo) avec alpine linux + jlink.
[AWS Lambda] Créer un package de déploiement à l'aide de l'image Amazon Linux Docker
Que faire lorsqu'une partie de l'image d'arrière-plan devient transparente lorsque l'image transparente est combinée avec Oreiller
L'image est Namekuji
[Statistiques] Saisir l'image de la théorie de la limitation du pôle central avec un graphe
Sous Linux, l'horodatage d'un fichier est un peu dépassé.
[Go] Créez une commande CLI pour changer l'extension de l'image
Créer une image de conteneur Docker avec JRE8 / JDK8 sur Amazon Linux
Créez un programme de jugement de compatibilité avec le module aléatoire de python.
J'ai essayé de créer facilement une image 3D de haute précision avec une seule photo [-1]. (La zone cachée est-elle vraiment visible?)