1. ホーム
  2. java

[解決済み] Java 11のベースDockerイメージはなぜこんなに大きいのですか?(openjdk:11-jre-slim)

2022-04-16 21:36:07

質問

Java 11は最新のLTSバージョンと発表されています。そこで、このJavaのバージョンをベースに新しいサービスを始めようとしています。

しかし、Java 11のベースDockerイメージは、Java 8の同等品よりもはるかに大きいです。

(のみを考慮しています)。 公式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.jartools.jar は非推奨となったことなどから、サイズを考慮すると modules 9以前のOpenJDKビルドと比較すると rt.jartools.jar を差し引く必要があります(合わせて80MBほどかかるはずです)。