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!
--Java Flight Recorder fonctionne
** 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.
Décrit le problème de l'image officielle d'OpenJDK 11 en détail.
$ 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)
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···
#
Prenons l'approche de l'utilisation de linux alpin, puis de jlink pour le rendre plus petit.
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 ...
Construisez en utilisant la multi-étape.
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.
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.
Recommended Posts