Java 11应用程序作为轻量级Docker映像

Java 11应用程序作为轻量级Docker映像,第1张

Java 11应用程序作为轻量级Docker映像

到目前为止,以简单的spring
boot应用程序为例(只有一个REST端点),我能够找出以下解决方案(考虑到应用程序jar位于

build/libs/spring-boot-demo.jar
Docker构建之前):

  1. __如果我们想 在稳定的超薄Linux版本上 使用 Oracle OpenJDK官方发行版的 绝地路径

    Debian 9 "Stretch"
    目前):

    • 使用
      debian:stretch-slim
      (最新稳定)基础图像
    • 使用Docker多阶段构建

    • 第一个Docker构建阶段:

      • Oracle OpenJDK
        在第一个Docker构建阶段下载并安装档案
      • 使用

        jlink
        工具为您的项目(又名JRE)编译Java最小发行版

        1. 第二个Docker构建阶段:
      • 从第1阶段将已编译的最小Java发行版复制到新映像

      • 配置访问Java的路径
      • 将应用程序jar复制到映像

所以,最终

Dockerfile
看起来像这样

具体化JDK

VERSION
URL
HASH
):

    # First stage: JDK 11 with modules required for Spring BootFROM debian:stretch-slim as packager# source JDK distribution names# update from https://jdk.java.net/java-se-ri/11ENV JDK_VERSION="11.0.1"ENV JDK_URL="https://download.java.net/java/GA/jdk11/13/GPL/openjdk-${JDK_VERSION}_linux-x64_bin.tar.gz"ENV JDK_HASH="7a6bb980b9c91c478421f865087ad2d69086a0583aeeb9e69204785e8e97dcfd"ENV JDK_HASH_FILE="${JDK_ARJ_FILE}.sha2"ENV JDK_ARJ_FILE="openjdk-${JDK_VERSION}.tar.gz"# target JDK installation namesENV OPT="/opt"ENV JKD_DIR_NAME="jdk-${JDK_VERSION}"ENV JAVA_HOME="${OPT}/${JKD_DIR_NAME}"ENV JAVA_MINIMAL="${OPT}/java-minimal"# downlodad JDK to the local fileADD "$JDK_URL" "$JDK_ARJ_FILE"# verify downloaded file hashsumRUN {         echo "Verify downloaded JDK file $JDK_ARJ_FILE:" &&         echo "$JDK_HASH $JDK_ARJ_FILE" > "$JDK_HASH_FILE" &&         sha256sum -c "$JDK_HASH_FILE" ;     }# extract JDK and add to PATHRUN {         echo "Unpack downloaded JDK to ${JAVA_HOME}/:" &&         mkdir -p "$OPT" &&         tar xf "$JDK_ARJ_FILE" -C "$OPT" ;     }ENV PATH="$PATH:$JAVA_HOME/bin"RUN {         java --version ;         echo "jlink version:" &&         jlink --version ;     }# build modules distributionRUN jlink     --verbose     --add-modules         java.base,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument         # java.naming - javax/naming/NamingException        # java.desktop - java/beans/PropertyEditorSupport        # java.management - javax/management/MBeanServer        # java.security.jgss - org/ietf/jgss/GSSException        # java.instrument - java/lang/instrument/IllegalClassFormatException    --compress 2     --strip-debug     --no-header-files     --no-man-pages     --output "$JAVA_MINIMAL"# Second stage, add only our minimal "JRE" distr and our appFROM debian:stretch-slimENV JAVA_HOME=/opt/java-minimalENV PATH="$PATH:$JAVA_HOME/bin"COPY --from=packager "$JAVA_HOME" "$JAVA_HOME"COPY "build/libs/spring-boot-demo.jar" "/app.jar"EXPOSE 8080CMD [ "-jar", "/app.jar" ]ENTRYPOINT [ "java" ]

注意事项

* 最小JRE示例(`java.base,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument`)中包含5个Java模块。我发现他们“手动”运行应用程序并修复`ClassNotFoundException`。等待更多的Spring Boot开发人员建议/指南,包括哪些Java模块以及何时包括,这与删除一些冗余依赖项(如)相同`java.desktop`,似乎仅用于`PropertyEditorSupport`* 如果您害怕错过某些模块-它们非常轻巧,并且所有模块加在一起大约增加2 MB的大小。获取`java.*`和`jdk.*`11个模块的完整列表:

java --list-modules | grep -E "^java.[^@]*" | cut -d @ -f 1

java --list-modules | grep -E "^jdk.[^@]*" | cut -d @ -f 1

在我的情况下,最终的映像大小为 123 MB (最少7个Spring Boot模块),所有模块为 125 MB

java.*

作为此构建工作流程的可选改进

* 使用下载并提取的JDK预先构建映像,并将其用作第一阶段的基础映像* 如果您每次都知道要包含哪些模块,请使用已编译的最小JRE和包含的模块预先构建基本映像
  1. 使用 供应商的Open JDK发行版的 简单方法:

与Oracle Azul相反,Zulu JDK
11支持Alpine端口并具有各自的基础Docker映像。

因此,如果尊重Zulu JVM / JDK,则Docker构建会简单得多:

FROM azul/zulu-openjdk-alpine:11 as packagerRUN {         java --version ;         echo "jlink version:" &&         jlink --version ;     }ENV JAVA_MINIMAL=/opt/jre# build modules distributionRUN jlink     --verbose     --add-modules         java.base,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument         # java.naming - javax/naming/NamingException        # java.desktop - java/beans/PropertyEditorSupport        # java.management - javax/management/MBeanServer        # java.security.jgss - org/ietf/jgss/GSSException        # java.instrument - java/lang/instrument/IllegalClassFormatException    --compress 2     --strip-debug     --no-header-files     --no-man-pages     --output "$JAVA_MINIMAL"# Second stage, add only our minimal "JRE" distr and our appFROM alpineENV JAVA_MINIMAL=/opt/jreENV PATH="$PATH:$JAVA_MINIMAL/bin"COPY --from=packager "$JAVA_MINIMAL" "$JAVA_MINIMAL"COPY "build/libs/spring-boot-demo.jar" "/app.jar"EXPOSE 8080CMD [ "-jar", "/app.jar" ]ENTRYPOINT [ "java" ]

生成的图像为 73 MB ,与剥离的Alpine发行版预期的一样。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4901569.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存