Dockerでの軽量なJava実行環境の検証

2023/12/01に公開

OpenJDKの非推奨に伴って代替Imageの検証

おそらく一番広く使用されていたであろうコンテナ環境のJavaImageが非推奨になったため、代替のImageを探す必要がある。

https://hub.docker.com/_/openjdk

今回は、他の代替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がない

https://github.com/ibmruntimes/semeru-containers

ただし、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