質問に触発されたJavaベース11ドッカーイメージが非常に大きいのはなぜ?(OpenJDKの:11-JRE-スリム)私は、Javaの世界では、このトピックはまだ確定していないことがわかりました。
07 Dec 2018
(上記チケットで説明)一般的な問題/落とし穴があります。
JREは、別々の「パッケージ」として配布されていません。JDKのモジュールは、代わりに使用する必要があります
オラクルのOpenJDK 11はサポートしていないLinuxのアルパインのように軽量な画像を簡単に作成することができません
- 同じ時間では、現在の安定したDebianのバージョンはまだ持っていないJavaの11のパッケージ(UbuntuはJavaの10がインストールされている不安定なSIDのバージョンは、ベースドッキングウィンドウのイメージに使用されている理由ですOpenJDKの-11パッケージの下)、
現在入手可能なOracleはOpenJDKの-11の画像がストリップされていないビルドする
libjvm.so
数百メガバイトを持っており、個別に取り除かれなければならないモジュールを、:
これらの問題の結果でもスリムオラクルのJavaベース11のイメージはかなり重いと不安定であると考えられている。https://hub.docker.com/_/openjdk/
そこで質問です:
何をされ、最適化または推奨構築し、ドッキングウィンドウ画像としてJavaの11個のアプリケーションを提供する方法を?
07.2019からUPD:https://stackoverflow.com/a/57145029/907576
(一つだけのRESTエンドポイントとの)単純泉ブートアプリケーションの例として取るとは、これまでのところ、私は考えるアプリケーションジャーは次の場所にあります(次の解決策を見つけ出すことができたbuild/libs/spring-boot-demo.jar
ドッカービルドの前に:
ジェダイのパス我々は、使用したい場合は安定したスリムLinuxバージョンの公式のOracle OpenJDKの分布を(
Debian 9 "Stretch"
今のところ):- 使用
debian:stretch-slim
(最新の安定版)の基本イメージ -
まずドッカービルド段階:
- ダウンロードしてインストールする
Oracle OpenJDK
最初のドッカービルドステージ上でアーカイブを - コンパイルのJava(JRE別名)プロジェクトのための最小限の配布使用
jlink
ツール
- ダウンロードしてインストールする
第二にドッカービルド段階:
- 新しいイメージに、ステージ1からコンパイルされ、最小限のJava分布をコピーします
- アクセスJavaへのconfigureのパス
- 画像へのアプリケーションjarファイルをコピーします
だから、最終的
Dockerfile
なルックスは次のようになめらか(JDK実現
VERSION
、URL
および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と含まれるモジュールとベースイメージを事前に構築
- 使用
簡単な方法ベンダーのオープン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メガバイト剥離アルパイン分布と予想されるように、。