web-dev-qa-db-ja.com

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

Java 11が最新のLTSバージョンであると発表されました。だから、私たちはこのJavaバージョンに基づいて新しいサービスを始めようとしています。

ただし、Java 11の基本Dockerイメージは、Java 8の同等のDockerイメージよりはるかに大きくなります。

(私は各Javaバージョンに対して 公式OpenJDK最も軽量なのイメージだけを考えています。)

さらに深く掘り下げた結果、次の「こと」が明らかになりました。

  • openjdk:11-jre-slim imageはベースイメージdebian:sid-slimを使います。これには2つの問題があります。

    • これはAlpine:3.8より60 MB大きい

    • Debianのsid のバージョンは不安定です

  • イメージにインストールされているopenjdk-11-jre-headlessパッケージは、openjdk8-jreよりも 3倍大きい (実行中の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/
      

      さらに深くなると、私はこの重さの「根」を発見しました - それはJDKの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のスリムイメージのベースイメージとして使われなくなったのですか?

  • 不安定なsidバージョンがLTS Javaイメージに使用されるのはなぜですか?

  • OpenJDK 11のスリム/ヘッドレス/ JREパッケージが、同様のOpenJDK 8パッケージと比べて非常に大きいのはなぜですか?

    • OpenJDK 11で135 MBのサイズのこの{modulesファイルとは何ですか?

_ upd _ :これらの課題に対する解決策として、この答えを使うことができます。 docker imageとしてのJava 11アプリケーション

68
radistao

Java 11個のスリムイメージのベースイメージとしてAlpineが使用されなくなったのはなぜですか?

残念ながら、現時点ではAlpine用の公式の安定したOpenJDK 11ビルドがないためです。

Alpineは、ほとんどのLinuxで使用されている標準のglibcとは対照的に、musl libcを使用します。つまり、Vanilla AlpineをサポートするためにJVMはmusl libcと互換性がなければなりません。 musl OpenJDKポートは、OpenJDKの Portola プロジェクトの下で開発されています。

現在のステータスは OpenJDK 11ページ に要約されています:

  • このページで以前利用できたAlpine Linuxビルドは、JDK 11 GAの時点で削除されました。 GAビルドと見なされるほど十分にテストされていないため、実稼働に対応していません。代わりに早期アクセスJDK 12 Alpine Linuxビルドを使用してください。

現在、Alpineの唯一の安定したOpenJDKバージョンは7と8で、 IcedTea プロジェクトによって提供されています。

ただし、公式のOpenJDK以外を検討する場合は、 Azul's Zul OpenJDKは魅力的な代替手段を提供します。

  • Alpine musl上のJava 11 (執筆時点のバージョン11.0.2)をサポートしています。
  • OpenJDK TCKコンプライアンススイートを使用して検証されたOpenJDK認定ビルドです。
  • 無料で、オープンソースで、ドッカーに対応しています( Dockerhub )。

サポートの可用性とロードマップについては、 Azul support roadmap をご覧ください。

更新、3/6/19:昨日現在、openjdk11はAlpineリポジトリで利用可能です!以下を使用してAlpineで取得できます。

apk --no-cache add openjdk11

このパッケージは、jdk11u OpenJDKブランチに加え、次の PR で導入されたプロジェクトPortolaからの移植された修正に基づいています。アルパインチームに感謝します。

なぜ不安定sidバージョンがLTS Javaイメージに使用されるのですか?

それは公正な質問/要求です。実際には、安定したDebianリリースでJava 11を提供するためのオープンチケットがあります。
https://github.com/docker-library/openjdk/issues/237

更新、26/12/18:この問題は解決され、現在OpenJDK 11スリムイメージはstretch-backports OpenJDK 11に基づいています最近利用可能になりました( PRリンク )。

OpenJDK 11のスリム/ヘッドレス/ JREパッケージは、類似のOpenJDK 8パッケージと比較してなぜそんなに大きいのですか? OpenJDK 11で135 MBをもたらすこのmodulesファイルとは何ですか?

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を置き換えることです。そのため、9以前のOpenJDKビルドと比較してmodulesのサイズを考慮すると、 rt.jartools.jarのサイズを減算する必要があります(合計80MBを占有する必要があります)。

116
valiano

2019年7月 https://adoptopenjdk.net/ はJava 11の公式Alpineサポートを持っています:

ただし、最小限のアプリケーションをアセンブルするときは、モジュール(jmodsjlink)が引き続き考慮されます。

slim画像にはいくつかのモジュールが含まれていません(Java.sqlなど)-それら明示的に除外されます( https://github.com/AdoptOpenJDK/openjdk-docker/blob/21b8393b9c23f94d6921a56cce27b026537c6ca2/11/jdk/Alpine/slim-Java.sh#L2

2
radistao