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


145

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

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

(私は公式のOpenJDKと各Javaバージョンの最も軽量なイメージのみを検討しています。)

より深く掘り下げると、次の「もの」が明らかになりました。

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

    • これは60 MB大きいです alpine:3.8

    • Debianのsidバージョンは不安定であり、

  • openjdk-11-jre-headlessイメージにインストールされているパッケージは、(Dockerコンテナーの実行中)の3倍openjdk8-jreです。

    • 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はJDKのファイルです:

      # ls -lhG /usr/lib/jvm/java-11-openjdk-amd64/lib/modules
      135M    /usr/lib/jvm/java-11-openjdk-amd64/lib/modules

それで、今来た質問:

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

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

  • OpenJDK 11のスリム/ヘッドレス/ JREパッケージが、類似のOpenJDK 8パッケージと比較してなぜそれほど大きいのですか?

    • OpenJDK 11で135 MBをもたらすこのモジュールファイルは何ですか?

UPD:これらの課題の解決策として、この答えを使用できます:DockerイメージとしてのJava 11アプリケーション


1
Javaの1つの新しいバージョン(JDK 9+)はモジュール化されており、11と8にモジュールがある理由を説明しています
Zachary Craig


13
JRE 11がないため、お持ちのものが完全なJDKです。JRE 8よりもさらにスリムなコンパクトな環境を作成できますが、依存関係がわかるように実際のモジュール式アプリケーションが必要です。
Holger、

1
上記に加えて、サイズの増加の理由として見つけたすべてのモジュールが実際にアプリケーションに必要なわけではありません。しかし、どのモジュールを見つけるかについては、モジュール式アプリケーションの作成に進みます。そのために、jlink(Java9で導入)について詳しく知ることができます。
ナマン

1
これをオンラインで読むのに最適
Naman

回答:


172

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

残念なことに、現在のところ、Alpine用の公式の安定したOpenJDK 11ビルドはありません。

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

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

このページで以前に利用可能だったAlpine Linuxビルドは、JDK 11 GAから削除されました。GAビルドと見なされるほど十分にテストされていないため、本番環境には対応していません。代わりに、早期アクセスのJDK 12 Alpine Linuxビルドを使用してください。

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

ただし、公式のOpenJDK以外を検討する場合は、AzulのZulu OpenJDKが強力な代替手段を提供します。

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

サポートの可用性とロードマップについては、Azulサポートロードマップを参照してください。

更新、19/3/6:昨日現在openjdk11、Alpineリポジトリで利用可能です!次のものを使用して、Alpineをつかむことができます。

apk --no-cache add openjdk11

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

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

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

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

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

Java 9では、jarファイルと比較して、パッケージとリソースをグループ化するための新しく改善されたアプローチであるモジュールシステムが導入されました。オラクルのこの記事では、この機能の非常に詳細な紹介を提供しています。https
//www.oracle.com/corporate/features/understanding-java-9-modules.html

このmodulesファイルには、JREに付属するすべてのモジュールがバンドルされています。モジュールの完全なリストは、で印刷できますjava --list-modulesmodules確かに非常に大きなファイルであり、コメントされているように、すべての標準モジュールが含まれているため、かなり肥大化しています。

ただし、特にrt.jartools.jarこれは置き換えられて非推奨になりました。そのため、modules9より前のOpenJDKビルドと比較した場合のサイズを考慮に入れるrt.jarと、およびのサイズをtools.jar差し引く必要があります(合計で約80MBを使用する必要があります)。 。


9

2019年7月と同様に、https //adoptopenjdk.net/ はJava 11のアルパインを公式にサポートしています。

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

スリムイメージには、(java.sql)などの一部のモジュールが含まれていません-それらは明示的に除外されていますhttps://github.com/AdoptOpenJDK/openjdk-docker/blob/21b8393b9c23f94d6921a56cce27b026537c6ca2/11/jdk/alpine/slim-java.sh#L233


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.