Dockerでの軽量なJava実行環境の検証
OpenJDKの非推奨に伴って代替Imageの検証
おそらく一番広く使用されていたであろうコンテナ環境のJavaImageが非推奨になったため、代替のImageを探す必要がある。
今回は、他の代替Imageの検証及び、Jlink等を使用したカスタムでの実行環境について説明し、比較する。
代替Imageの検証
今回は、Dockerのofficial Imageのみを検証する。オフィシャルなものは、OpenJDKのページにも書いてある通り、以下の五つ。
優先度的には以下の基準で比較をする。
- 広く使用されているもの
- 軽量なもの
最後にSpringBootProjectを使用してImageを作成した際の大まかなサイズの違いを一覧で表にしている。
imbJava
サポートされいているのがJava8のみとなっており、今回の検証ではJava11もしくはJava11の実行環境が欲しいため、まず初めに候補から除外する。
Sapmachine
以下の理由から、候補から除外する。
- Pull数が最も少ない
- Linuxで最も軽量なAlpineをベースとしたimageがない
- Jdk,JREなどのTagがない
imb-semeru-runtimes
以下の理由から、候補から除外する。
- Pull数が二番めに少ない
- Linuxで最も軽量なAlpineをベースとしたimageがない
ただし、Alpineではメモリ周りの関係から、Javaの実行速度が遅いという記事もあるため
実行速度を求める方はCentOS, Ubuntuをbaseにしているので、こちらも候補に入れても良いと考える。
amazoncorreto
Pull数が多く、AlpineベースのImageがあり、かつJDK,JREなどのTagバージョンもサポートしているため、候補に入れる。
※ただし、Alpine以外のBaseのOSがAmazon Linuxなので、Ubuntuが良い場合は、eclipse-temurinにした方が良い。
eclipse-temurin
Pull数が多く、AlpineベースのImageがあり、かつJDK,JREなどのTagバージョンもサポートしているため、候補に入れる。
SpringBootを用いたImageのサイズ比較
SpringBootのサンプルプロジェクトを用いて、イメージのサイズを比較すると、以下のようになった。
ImageTag | size |
---|---|
sapmachine | 538MB |
ibm-semeru-runtimes | 389MB |
eclipse-temurin:11-jre-alpine | 265MB |
eclipse-temurin:11-jdk | 556MB |
eclipse-temurin:11-jdk-jammy | 556MB |
eclipse-temurin:11-jdk-focal | 561MB |
まとめ
以上のことから既存のImageを使用する場合は、Eclipse-temurinもしくはamazoncorretoを使用するのが良さそうということがわかった。
個人的には、SpringBootを多く使用しているので、SpringBootの公式ドキュメントでも説明に使用されているeclipse-temurinを選んでおけば問題ない。
AlpineのImageを使用する際の注意
AlpineではshellをbashではなくAshというshellを使用している。
そのため、一部のAlpineをbaseとしてimageではbashのオプションが使用できず、Shell Scriptによる実行でエラーが起こる場合があるので注意が必要。
例: -lオプションがAshでは使用できない。
#!bin/bash -l
-l を消して、以下のように書く必要がある。
#!bin/bash
もしくはこのような書き方など。
#!/usr/bin/env ash
Jlinkを使用したカスタムImageによる実行環境の作成
Jlinkを使用したカスタムImageでも、軽量なImageを作成することができるため、こちらも推奨される。
しかし、プロジェクトによって使用するモジュールの抽出等をする必要があるため、dockerfileが少し長く煩雑になってしまうことが懸念点、詳細については、別記事にて書く予定。
Discussion