軽量ドッキングウィンドウの画像などのJavaアプリケーション11

radistao:

質問に触発されたJavaベース11ドッカーイメージが非常に大きいのはなぜ?(OpenJDKの:11-JRE-スリム)私は、Javaの世界では、このトピックはまだ確定していないことがわかりました。

07 Dec 2018(上記チケットで説明)一般的な問題/落とし穴があります。

これらの問題の結果でもスリムオラクルのJavaベース11のイメージはかなり重いと不安定であると考えられている。https://hub.docker.com/_/openjdk/

そこで質問です:

何をされ、最適化または推奨構築し、ドッキングウィンドウ画像としてJavaの11個のアプリケーションを提供する方法を

radistao:

07.2019からUPDhttps://stackoverflow.com/a/57145029/907576

(一つだけのRESTエンドポイントとの)単純泉ブートアプリケーションの例として取るとは、これまでのところ、私は考えるアプリケーションジャーは次の場所にあります(次の解決策を見つけ出すことができたbuild/libs/spring-boot-demo.jarドッカービルドの前に:

  1. ジェダイのパス我々は、使用したい場合は安定したスリムLinuxバージョンの公式のOracle OpenJDKの分布をDebian 9 "Stretch"今のところ):

    • 使用debian:stretch-slim(最新の安定版)の基本イメージ
    • 使用ドッカー多段ビルド

      1. まずドッカービルド段階:

        • ダウンロードしてインストールするOracle OpenJDK最初のドッカービルドステージ上でアーカイブを
        • コンパイルのJava(JRE別名)プロジェクトのための最小限の配布使用jlinkツール
      2. 第二にドッカービルド段階:

        • 新しいイメージに、ステージ1からコンパイルされ、最小限のJava分布をコピーします
        • アクセスJavaへのconfigureのパス
        • 画像へのアプリケーションjarファイルをコピーします

    だから、最終的Dockerfileなルックスは次のようになめらか

    JDK実現VERSIONURLおよびHASH)。

    # First stage: JDK 11 with modules required for Spring Boot
    FROM debian:stretch-slim as packager
    
    # source JDK distribution names
    # update from https://jdk.java.net/java-se-ri/11
    ENV 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 names
    ENV 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 file
    ADD "$JDK_URL" "$JDK_ARJ_FILE"
    
    # verify downloaded file hashsum
    RUN { \
            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 PATH
    RUN { \
            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 distribution
    RUN 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 app
    FROM debian:stretch-slim
    
    ENV JAVA_HOME=/opt/java-minimal
    ENV PATH="$PATH:$JAVA_HOME/bin"
    
    COPY --from=packager "$JAVA_HOME" "$JAVA_HOME"
    COPY "build/libs/spring-boot-demo.jar" "/app.jar"
    
    EXPOSE 8080
    CMD [ "-jar", "/app.jar" ]
    ENTRYPOINT [ "java" ]
    

    注意

    • 最小JREの例に含ま5つのJavaモジュールは、(存在しますjava.base,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument)。私は彼らが「手動」アプリケーションを実行し、固定ましたClassNotFoundExceptionいくつかの冗長な依存関係を削除するのと同じように、Javaは時に含めるとするモジュールいくつかの更なる春ブーツ開発者の推薦/ガイドを待っている、のようなjava.desktop、だけのために使用されるように思われますPropertyEditorSupport
    • あなたには、いくつかのモジュールを逃すことを恐れている場合-彼らは非常に軽量で、それらのすべてが一緒に2メガバイトのサイズが増加について与えます。完全なリストを取得java.*し、jdk.*11個のモジュール:

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

    私の場合に得られる画像のサイズであった123メガバイト最小7つのスプリングブートモジュールと、および125メガバイトすべてとjava.*モジュール

    このビルドワークフローのオプションの改良として

    • ダウンロード抽出JDKで画像を事前に構築し、第一段階のためのベース画像として使用します
    • あなたはすべての時間を含めるためにどのモジュールを知っていれば - コンパイル最小限のJREと含まれるモジュールとベースイメージを事前に構築
  2. 簡単な方法ベンダーのオープンJDKディストリビューション

    Oracleへの反対アズールのズールー族のJDK 11のサポートアルパインポートと各基地たドッカーイメージを

ズールーJVM / JDKが尊重されている場合このように、ドッカービルドははるかに簡単です:

FROM azul/zulu-openjdk-alpine:11 as packager

RUN { \
        java --version ; \
        echo "jlink version:" && \
        jlink --version ; \
    }

ENV JAVA_MINIMAL=/opt/jre

# build modules distribution
RUN 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 app
FROM alpine

ENV JAVA_MINIMAL=/opt/jre
ENV PATH="$PATH:$JAVA_MINIMAL/bin"

COPY --from=packager "$JAVA_MINIMAL" "$JAVA_MINIMAL"
COPY "build/libs/spring-boot-demo.jar" "/app.jar"

EXPOSE 8080
CMD [ "-jar", "/app.jar" ]
ENTRYPOINT [ "java" ]

得られた画像は、73メガバイト剥離アルパイン分布と予想されるように、。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=37956&siteId=1