AdoptOpenJDK | AdoptOpenJDK-Alpine | Custom Runtime |
---|---|---|
436 MB | 358 MB | 85.5 MB |
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
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)
jlink --add-modules
die in Schritt ① ausgegebenen Module.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
Fügen Sie die in Schritt ② vorbereitete Docker-Datei hinzu.
Die Einstellungen zum Starten von Java unter alpinem Linux wurden unter Bezugnahme auf die folgende Site hinzugefügt.
Erstellen einer kompakten Java-Umgebung, die unter Docker ausgeführt wird
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"]
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
Recommended Posts