Java 11が最新のLTSバージョンであると発表されました。だから、私たちはこのJavaバージョンに基づいて新しいサービスを始めようとしています。
ただし、Java 11の基本Dockerイメージは、Java 8の同等のDockerイメージよりはるかに大きくなります。
openjdk:8-jre-Alpine
:84 MB
openjdk:11-jre-slim
: 283 MB
(私は各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パッケージと比べて非常に大きいのはなぜですか?
_ upd _ :これらの課題に対する解決策として、この答えを使うことができます。 docker imageとしてのJava 11アプリケーション
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は魅力的な代替手段を提供します。
サポートの可用性とロードマップについては、 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.jar
とtools.jar
のサイズを減算する必要があります(合計80MBを占有する必要があります)。
2019年7月 https://adoptopenjdk.net/ はJava 11の公式Alpineサポートを持っています:
ただし、最小限のアプリケーションをアセンブルするときは、モジュール(jmods、jlink
)が引き続き考慮されます。
注:slim画像にはいくつかのモジュールが含まれていません(Java.sql
など)-それら明示的に除外されます( https://github.com/AdoptOpenJDK/openjdk-docker/blob/21b8393b9c23f94d6921a56cce27b026537c6ca2/11/jdk/Alpine/slim-Java.sh#L2 )