[解決済み] Java 11のベースDockerイメージはなぜこんなに大きいのですか?(openjdk:11-jre-slim)
質問
Java 11は最新のLTSバージョンと発表されています。そこで、このJavaのバージョンをベースに新しいサービスを始めようとしています。
しかし、Java 11のベースDockerイメージは、Java 8の同等品よりもはるかに大きいです。
-
openjdk:8-jre-alpine
: 84 MB -
openjdk:11-jre-slim
: 283 MB
(のみを考慮しています)。 公式OpenJDK と 最も軽量な の画像は、各Javaバージョンに対応しています)。
さらに掘り下げると、以下のようなことが判明しました。
-
その
openjdk:11-jre-slim
の画像はベース画像を使用しています。debian:sid-slim
. これは2つの問題をもたらします。-
よりも60MB大きいです。
alpine:3.8
-
その Debian
sid
のバージョンは不安定です。
-
-
その
openjdk-11-jre-headless
イメージにインストールされているパッケージは 3倍の大きさ よりもopenjdk8-jre
(実行中のDockerコンテナ内)。-
openjdk:8-jre-alpine
:/ # du -hs /usr/lib/jvm/java-1.8-openjdk/jre/lib/ 57.5M /usr/lib/jvm/java-1.8-openjdk/jre/lib/
-
openjdk:11-jre-slim
:# du -sh /usr/lib/jvm/java-11-openjdk-amd64/lib/ 179M /usr/lib/jvm/java-11-openjdk-amd64/lib/
この重苦しさの根源は、もっと深く掘り下げると、次のようなものでした。
<ブロッククオートmodules
ファイルを作成しました。# ls -lhG /usr/lib/jvm/java-11-openjdk-amd64/lib/modules 135M /usr/lib/jvm/java-11-openjdk-amd64/lib/modules
-
では、次に出てきた質問です。
-
なぜ
alpine
は、Java 11 slim イメージのベースイメージとして、もう使われていないのですか? -
なぜ、不安定な シド のバージョンがLTSのJavaイメージに使用されていますか?
-
OpenJDK 11 の slim/headless/JRE パッケージは、同様の OpenJDK 8 パッケージと比較して、なぜこんなに大きいのですか?
- これは何ですか モジュール ファイルは、OpenJDK 11で135MBをもたらすのですか?
アップデイト このような課題に対する解決策として、次のような回答が考えられます。 Java 11アプリケーションをDockerイメージで提供
解決方法は?
<ブロッククオート
なぜ
alpine
は、Java 11 のスリムイメージのベースイメージとして使われなくなったのですか?
それは、悲しいかな、現在、アルパイン用の公式なOpenJDK 11の安定したビルドがないからです。
アルパインは、ほとんどのLinuxで使われている標準のglibcではなく、musl libcを使用しています。つまり、バニラアルパインをサポートするためには、JVMがmusl libcと互換性がなければなりません。muslのOpenJDKへの移植は、OpenJDKの ポートラ プロジェクトに参加しています。
現在の状況は、以下のページにまとめられています。 OpenJDK 11のページ :
<ブロッククオート以前このページで公開していたAlpine Linuxのビルドは、JDK 11 GAで削除されました。これはGAビルドと言えるほど十分にテストされていないため、製品化には至っていません。代わりに早期アクセス版の JDK 12 Alpine Linux ビルドをご利用ください。
現在、Alpine用の安定したOpenJDKのバージョンは、7と8だけです。 IcedTea プロジェクトに参加しています。
しかし--公式のOpenJDK以外を検討してもいいというのなら。 アズールのズールー OpenJDKは、魅力的な代替手段を提供してくれます。
- をサポートしています。 Java 11 on Alpine musl (執筆時点ではバージョン11.0.2)。
- OpenJDK TCKコンプライアンス・スイートを使用して検証された、認定OpenJDKビルドです。
- 無料、オープンソース、Docker対応です( ドッカーハブ ).
サポートの可否とロードマップについては、以下を参照してください。 Azulサポートロードマップ .
19年3月6日に更新しました。
昨日の時点では
openjdk11
がアルパインリポジトリで利用できるようになりました アルパインでつかえるようになりました。
apk --no-cache add openjdk11
このパッケージは
jdk11u
OpenJDKブランチにPortolaプロジェクトから移植された修正を加えたもので、以下のように導入されています。
PR
. アルパイン・チームの皆さん、お疲れ様でした。
なぜ、不安定な シド LTSのJavaイメージに使用されるバージョン?
それは正しい質問/要望です。実際、Debian の安定版リリースで Java 11 を提供するためのオープンチケットが存在します。
https://github.com/docker-library/openjdk/issues/237
18年12月26日に更新しました。
この問題は解決され、現在、OpenJDK 11 のスリムイメージには
stretch-backports
先日公開されたOpenJDK11(
PRリンク
).
OpenJDK 11 の slim/headless/JRE パッケージは、同様の OpenJDK 8 のパッケージと比較して、なぜこんなに大きいのですか?これは何ですか? モジュール ファイルは、OpenJDK 11 で 135 MB もあるのですか?
Java 9 では、jar ファイルと比較して、パッケージとリソースをグループ化するための新しい改良されたアプローチであるモジュールシステムが導入されました。Oracleのこの記事では、この機能について非常に詳しく紹介しています。
https://www.oracle.com/corporate/features/understanding-java-9-modules.html
は
modules
ファイルには、JRE に同梱されているすべてのモジュールがバンドルされています。モジュールの全リストを表示するには
java --list-modules
.
modules
は確かに非常に大きなファイルで、コメントされているように、すべての標準的なモジュールを含んでいるため、かなり肥大化しています。
しかし、1つだけ注目すべきは、それが
rt.jar
と
tools.jar
は非推奨となったことなどから、サイズを考慮すると
modules
9以前のOpenJDKビルドと比較すると
rt.jar
と
tools.jar
を差し引く必要があります(合わせて80MBほどかかるはずです)。
関連
-
java の例外が発生しました java
-
アクセス制限について アプリケーションの種類がAPIでない(必要なライブラリの制限)。
-
final, finally, finalizeの違いについて話してください。
-
Javaクラスローダーにソースコードから潜り込む
-
リソースの読み込みに失敗しました。サーバーはステータス500(内部サーバーエラー)で応答しました。
-
SocketTimeoutExceptionの解決方法です。読み込みがタイムアウトした
-
HttpClientがGZIP形式でない場合の対処法
-
java 例外。Javaツールの初期化
-
[解決済み】Dockerイメージとコンテナの違いは何ですか?
-
[解決済み] Dockerイメージ - タイプ。スリム vs スリム-ストレッチ vs ストレッチ vs アルパイン
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スタイルが読み込まれず、ブラウザのコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
エラーが報告されました。リソースの読み込みに失敗しました:サーバーは500(内部サーバーエラー)のステータスで応答しました。
-
final, finally, finalizeの違いについて話してください。
-
javaの模造品QQ WeChatのチャットルーム
-
JavaMailのメール送信が失敗するケースとその説明の分析
-
サーブレットクラスのインスタンス化エラーの解決法
-
Spring BootのテストメソッドFailed to load ApplicationContextの問題を解決する
-
マスキング このリソースにアクセスするには、完全な認証が必要です。
-
このラインで複数のマーカーを解決する方法
-
コミットには何も追加されないが、未追跡のファイルが存在し、gitで未追跡のファイルに対する完璧な解決策