[JAVA] So verkleinern Sie das Spring Boot Docker-Image

einpacken

AdoptOpenJDK AdoptOpenJDK-Alpine Custom Runtime
436 MB 358 MB 85.5 MB

Beispielcode

Schritt ① Holen Sie sich das gewünschte Modul mit jdeps

Verwenden Sie den Befehl jdeps, um die abhängigen Module Ihrer SpringBoot-Anwendung zu überprüfen.

Wenn ich jedoch die ausführbare JAR-Datei von SpringBoot mit "jdeps" überprüfe, werden nur "java.base" und "java.logging" ausgegeben, und diese JRE allein startet SpringBoot nicht. Verwenden Sie daher das an der folgenden Site eingeführte Shell-Skript, um die abhängigen Module abzurufen.

#!/bin/sh
# jdeps-spring-boot

set -eu

readonly TARGET_JAR=$1
readonly TARGET_VER=$2

#Verzeichnis zum Extrahieren des Glases
readonly TMP_DIR="/tmp/app-jar"
mkdir -p ${TMP_DIR}
trap 'rm -rf ${TMP_DIR}' EXIT

#Glas extrahieren
unzip -q "${TARGET_JAR}" -d "${TMP_DIR}"

#Ausgabe
jdeps \
    -classpath \'${TMP_DIR}/BOOT-INF/lib/*:${TMP_DIR}/BOOT-INF/classes:${TMP_DIR}\' \
    --print-module-deps \
    --ignore-missing-deps \
    --module-path ${TMP_DIR}/BOOT-INF/lib/javax.activation-api-1.2.0.jar \
    --recursive \
    --multi-release ${TARGET_VER} \
    -quiet \
    ${TMP_DIR}/org ${TMP_DIR}/BOOT-INF/classes ${TMP_DIR}/BOOT-INF/lib/*.jar

Wenn der Dateiname von Shell Script "get-springboot-module.sh" lautet, führen Sie Folgendes aus.

./get-springboot-module.sh <SpringBoot Glas> <Java Version>

Ausführungsbeispiel:

./get-springboot-module.sh demo-0.0.1-SNAPSHOT.jar 11

Die für das Ausführungsergebnis erforderlichen Module werden ausgegeben.

java.base,java.desktop,java.instrument,java.management.rmi,java.naming,java.prefs,java.scripting,java.security.jgss,java.sql,jdk.httpserver,jdk.unsupported

wichtiger Punkt

Wenn Sie . / Get-springboot-module.sh ausführen, führen Sie es unter Java 12 oder höher aus.

Dies liegt daran, dass Java 11 einen Fehler aufweist, der eine NullPointerException verursacht, wenn versucht wird, eine Klasse zu analysieren, die beim Parsen von "javafx.media" nicht vorhanden ist. Um dies zu vermeiden, müssen Sie "--ignore-missing-deps" angeben, das aus Java 12 hinzugefügt wurde.

--Referenz: [Beim Scannen von Spring Boot .jar-Dateien ein NPE auf Java 11-Jdeps-Tool abrufen](https://stackoverflow.com/questions/59284163/getting-a-npe-on-java-11-jdeps-tool-when -scanning-spring-boot-jar-files)

Schritt ② Erstellen Sie eine benutzerdefinierte JRE

FROM adoptopenjdk/openjdk11:alpine AS java-build
WORKDIR /jlink
ENV PATH $JAVA_HOME/bin:$PATH
RUN jlink --strip-debug --no-header-files --no-man-pages --compress=2 --module-path $JAVA_HOME \
    --add-modules java.base,java.desktop,java.instrument,java.management.rmi,java.naming,java.prefs,java.scripting,java.security.jgss,java.sql,jdk.httpserver,jdk.unsupported \
    --output jre-min

Schritt ③ Starten Sie SpringBoot auf der benutzerdefinierten JRE mithilfe eines mehrstufigen Builds

FROM adoptopenjdk/openjdk11:alpine AS java-build
WORKDIR /jlink
ENV PATH $JAVA_HOME/bin:$PATH
RUN jlink --strip-debug --no-header-files --no-man-pages --compress=2 --module-path $JAVA_HOME \
    --add-modules java.base,java.desktop,java.instrument,java.management.rmi,java.naming,java.prefs,java.scripting,java.security.jgss,java.sql,jdk.httpserver,jdk.unsupported \
    --output jre-min


FROM alpine:3.12.0
USER root

RUN apk --update add --no-cache ca-certificates curl openssl binutils xz \
    && GLIBC_VER="2.28-r0" \
    && ALPINE_GLIBC_REPO="https://github.com/sgerrand/alpine-pkg-glibc/releases/download" \
    && GCC_LIBS_URL="https://archive.archlinux.org/packages/g/gcc-libs/gcc-libs-8.2.1%2B20180831-1-x86_64.pkg.tar.xz" \
    && GCC_LIBS_SHA256=e4b39fb1f5957c5aab5c2ce0c46e03d30426f3b94b9992b009d417ff2d56af4d \
    && ZLIB_URL="https://archive.archlinux.org/packages/z/zlib/zlib-1%3A1.2.9-1-x86_64.pkg.tar.xz" \
    && ZLIB_SHA256=bb0959c08c1735de27abf01440a6f8a17c5c51e61c3b4c707e988c906d3b7f67 \
    && curl -Ls https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub -o /etc/apk/keys/sgerrand.rsa.pub \
    && curl -Ls ${ALPINE_GLIBC_REPO}/${GLIBC_VER}/glibc-${GLIBC_VER}.apk > /tmp/${GLIBC_VER}.apk \
    && apk add /tmp/${GLIBC_VER}.apk \
    && curl -Ls ${GCC_LIBS_URL} -o /tmp/gcc-libs.tar.xz \
    && echo "${GCC_LIBS_SHA256}  /tmp/gcc-libs.tar.xz" | sha256sum -c - \
    && mkdir /tmp/gcc \
    && tar -xf /tmp/gcc-libs.tar.xz -C /tmp/gcc \
    && mv /tmp/gcc/usr/lib/libgcc* /tmp/gcc/usr/lib/libstdc++* /usr/glibc-compat/lib \
    && strip /usr/glibc-compat/lib/libgcc_s.so.* /usr/glibc-compat/lib/libstdc++.so* \
    && curl -Ls ${ZLIB_URL} -o /tmp/libz.tar.xz \
    && echo "${ZLIB_SHA256}  /tmp/libz.tar.xz" | sha256sum -c - \
    && mkdir /tmp/libz \
    && tar -xf /tmp/libz.tar.xz -C /tmp/libz \
    && mv /tmp/libz/usr/lib/libz.so* /usr/glibc-compat/lib \
    && apk del binutils \
    && rm -rf /tmp/${GLIBC_VER}.apk /tmp/gcc /tmp/gcc-libs.tar.xz /tmp/libz /tmp/libz.tar.xz /var/cache/apk/*

COPY --from=java-build /jlink/jre-min /opt/jre-min
COPY ./demo-0.0.1-SNAPSHOT.jar /opt/demo/demo-0.0.1-SNAPSHOT.jar
ENV PATH /opt/jre-min/bin:$PATH

EXPOSE 8080
WORKDIR /
CMD ["java", "-jar", "/opt/demo/demo-0.0.1-SNAPSHOT.jar"]

Lauf

docker build -t demo-official-openjdk-custom-runtime:latest .
docker images

REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
demo-official-openjdk-custom-runtime   latest              49049142374f        About an hour ago   85.5MB
docker run -d -p 8080:8080 --name demo-official-openjdk-custom-runtime demo-official-openjdk-custom-runtime:latest

andere Referenzen

Recommended Posts

So verkleinern Sie das Spring Boot Docker-Image
So stellen Sie Spring Boot + PostgreSQL ein
Verwendung von ModelMapper (Spring Boot)
Erstellen Sie mit Gradle ein Spring Boot + Docker-Image
So teilen Sie eine Spring Boot-Nachrichtendatei
So stellen Sie sicher, dass CsrfRequestDataValueProcessor und der ursprüngliche RequestDataValueProcessor beim Spring Boot nebeneinander existieren
Verwendung von MyBatis2 (iBatis) mit Spring Boot 1.4 (Spring 4)
Verwendung des eingebauten h2db mit Federstiefel
Verwendung von Spring Boot-Sitzungsattributen (@SessionAttributes)
So installieren Sie Docker
So fügen Sie in Spring Boot einen Klassenpfad hinzu
Wie man ein schattiertes Glas macht
So geben Sie jemandem Ihr Image mit Docker
So binden Sie mit einer Eigenschaftendatei in Spring Boot
[Spring Boot] So verweisen Sie auf die Eigenschaftendatei
Spring Boot - So stellen Sie das Sitzungszeitlimit ein
So machen Sie ein Bild mit Processing teilweise transparent
So stellen Sie Spring Boot Dependency Injection (DI) ein
So schreiben Sie einen Komponententest für Spring Boot 2
Bereitstellen von einem lokalen Docker-Image auf Heroku
So erstellen Sie ein Spring Boot-Projekt in IntelliJ
[Spring Boot] So erstellen Sie ein Projekt (für Anfänger)
Verwendung von CommandLineRunner im Spring Batch von Spring Boot
Booten nach Umgebung mit Spring Boot of Maven
Versuchen Sie Spring Boot von 0 bis 100.
Java - So erstellen Sie JTable
Einführung in Spring Boot ~ ~ DI ~
So legen Sie Nginx von Docker fest
Einführung in Spring Boot ② ~ AOP ~
Spring Boot beginnend mit Docker
Aufbau der Docker x Spring Boot-Umgebung
Einführung in Spring Boot Teil 1
[Schienen] Wie man Samen macht
Lassen Sie uns schreiben, wie API mit SpringBoot + Docker von 0 erstellt wird
So ändern Sie den Einstellungswert von application.properties beim Booten im Frühjahrsstart
Aufrufen und Verwenden der API in Java (Spring Boot)
[Persönliche Notizen] So verschieben Sie ein Docker-Image in GitHub-Pakete
So steuern Sie Transaktionen in Spring Boot ohne Verwendung von @Transactional
Wie man Lombok im Frühling benutzt
Hinweise zur Verwendung von Spring Data JDBC
So erstellen Sie einen Java-Container
[So installieren Sie Spring Data Jpa]
Migrieren Sie das Docker-Image auf einen anderen Server
So erstellen Sie einen JDBC-Treiber
So führen Sie JavaFX unter Docker aus
So erstellen Sie einen Begrüßungsbildschirm
So erstellen Sie ein Jenkins-Plug-In
Rüsten Sie den Federstiefel von der 1.5-Serie auf die 2.0-Serie auf
Wie erstelle ich ein Maven-Projekt?
So erstellen Sie ein Java-Array
[Android] So erstellen Sie ein Dialogfragment
So erstellen Sie CloudStack mit Docker
So starten Sie Camunda mit Docker
So erstellen Sie mit Spring Boot einen eigenen Controller, der / error entspricht
Stellen Sie sich die Spring Boot-App mit dem Jib-Maven-Plugin vor und starten Sie sie mit Docker
So beschneiden Sie ein Bild in libGDX