Das Docker-Image von openjdk 11 ist im offiziellen Repository des Docker-Hubs verfügbar.
https://hub.docker.com/_/openjdk/
Aber ... ich mache mir ein bisschen Sorgen darüber
Es gibt ein Problem. Ich möchte es kleiner machen. Also habe ich versucht, wie klein es sein könnte!
** 1 GB → 85 MB und könnte auf weniger als 1/10 komprimiert werden: Grinsen: ** Persönlich bin ich sehr zufrieden.
Das Ergebnis der Überprüfung der Größe mit Docker-Bildern ist wie folgt.
Bildtyp | Verwenden Sie jlink | size |
---|---|---|
openjdk:11-jdk | TU es nicht | 1GB |
openjdk:11-jdk | Machen | 468MB |
Original Alpinelinux | TU es nicht | 336MB |
Original Alpinelinux | Machen | 84.6MB |
jdk11 ist die ea-version. Ich denke, dass es möglich sein wird, ein kleines Bild mit dem offiziellen Bild von openjdk 11 richtig zu machen. Original Alpinelinux, https://hub.docker.com/r/hirokimatsumoto/alpine-openjdk-11/ ist.
Beschreibt das Problem des offiziellen Images von OpenJDK 11 im Detail.
$ sudo docker images |grep jdk
docker.io/openjdk 11-jdk f684efd78557 2 weeks ago 979 MB
$
Der Flugschreiber funktioniert nicht mit jre, also möchte ich jdk verwenden ... er ist etwas zu groß. Referenz: [Qiita --OpenJDK11-JRE-SLIM funktioniert nicht mit Flight Recorder. ](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)
Das folgende Problem behebt dasselbe Problem. https://github.com/docker-library/openjdk/issues/217
Wenn ich es versuche ... Aus irgendeinem Grund werden es ungefähr 400 MB und die Bildgröße ungefähr 450 MB, wie unten gezeigt.
$ 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 #Noch klein
Versuchen Sie zu komprimieren
# 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 #Warum···
#
Nehmen wir den Ansatz, alpines Linux zu verwenden und dann jlink zu verwenden, um es kleiner zu machen.
Können andere Leute herumstehen? Ich denke, es ist für die Öffentlichkeit zugänglich.
image: https://hub.docker.com/r/hirokimatsumoto/alpine-openjdk-11/ docker file: https://hub.docker.com/r/hirokimatsumoto/alpine-openjdk-11/~/dockerfile/
Es tut mir leid, dass ich keine Prüfsumme habe ...
Erstellen Sie mit der mehrstufigen.
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
Die laufende Anwendung ist https://github.com/h-r-k-matsumoto/k8s-jmc-sample ist.
Zuerst habe ich jdeps verwendet, um die erforderlichen Module wie unten gezeigt zu überprüfen.
> jdeps --list-deps .\target\k8s-jmc-sample-0.1.0-SNAPSHOT.jar
java.base
java.logging
>
Auch wenn Sie damit eine Laufzeit machen ... Zum Zeitpunkt der Ausführung tritt ein Fehler auf, wie unten gezeigt.
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)
Hmmm, ich frage mich, ob ich die automatische Konfiguration im Federschuh nicht gut verfolgen kann ... Es war also nervig https://dev.solita.fi/2018/01/24/Java9-modules-Spring-Boot-2-Docker.html Ich habe es entsprechend hinzugefügt.
Recommended Posts