Da das Dokcer-Image (1 GB) von OpenJDK11 groß ist, erstellen Sie ein kleines Image (85 MB) mit Alpine Linux + Jlink.

Einführung

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!

Annahme

Ergebnis

** 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.

Problem

Beschreibt das Problem des offiziellen Images von OpenJDK 11 im Detail.

Große Bildgröße

$ 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)

In openjdk 11 (offiziell) wird es nicht kleiner, selbst wenn Sie jlink verwenden.

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···
#

Ich werde die Bildgröße reduzieren!

Nehmen wir den Ansatz, alpines Linux zu verwenden und dann jlink zu verwenden, um es kleiner zu machen.

Erstellen Sie ein Image für den Basis-Build von Alpine Linux.

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 jlink ein kleines Ausführungsimage.

Erstellen Sie mit der mehrstufigen.

  1. Erstellen Sie basierend auf dem oben erstellten Image von alpine linux + openjdk 11 ein kleines Java-Laufzeitmodul mit jlink.
  2. Erstellen Sie ein Image von Alphine Linux, das eine Kopie des Laufzeitmoduls und des JAR-Moduls ist.
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.

Ich war süchtig nach

Das Betrachten der Abhängigkeiten einer Spring Boot-Anwendung mit jdeps ist nicht korrekt

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.

Referenz

Recommended Posts

Da das Dokcer-Image (1 GB) von OpenJDK11 groß ist, erstellen Sie ein kleines Image (85 MB) mit Alpine Linux + Jlink.
[AWS Lambda] Erstellen Sie ein Bereitstellungspaket mit dem Amazon Linux Docker-Image
Was tun, wenn ein Teil des Hintergrundbilds transparent wird, wenn Sie transparente Bilder mit Pillow kombinieren?
Das Bild ist Namekuji
[Statistik] Erfassen Sie das Bild der zentralen Polbegrenzungstheorie mit einem Diagramm
Unter Linux ist der Zeitstempel einer Datei etwas vorbei.
[Los] Erstellen Sie einen CLI-Befehl, um die Erweiterung des Bildes zu ändern
Erstellen Sie ein Docker-Container-Image mit JRE8 / JDK8 unter Amazon Linux
Erstellen Sie ein Kompatibilitätsbewertungsprogramm mit dem Zufallsmodul von Python.
Ich habe versucht, mit einem Foto einfach ein hochpräzises 3D-Bild zu erstellen [-1]. (Ist der versteckte Bereich wirklich sichtbar?)