静的なイメージおよびほぼ静的なイメージ
GraalVMネイティブ・イメージでは、目的に応じて、静的なイメージまたはほとんど静的なイメージを作成できます。
静的なネイティブ・イメージとは、静的にリンクされたバイナリのことであり、追加のライブラリ依存性なしに使用できます。これにより、配布しやすくなり、スリムすなわちdistrolessのコンテナ・イメージにデプロイしやすくなります。これらは、静的にmusl-libc (軽量、高速かつ単純なlibc実装)をリンクすることで作成されます。
ほとんど静的なイメージは、libc以外のすべてのライブラリを静的にリンクします。このアプローチは、そのようなネイティブ・イメージをdistrolessコンテナ・イメージにデプロイする場合に最適です。現在は、glibcをリンクする場合のみ機能することに注意してください。
前提条件
- Linux AMD64オペレーティング・システム
- ネイティブ・イメージがサポートされるJava 11用のGraalVMディストリビューション
- 64ビットの
muslツールチェーン、makeおよびconfigure - 最新の
zlibライブラリ
準備
最初にmuslツールチェーンを取得してから、zlibをコンパイルしてツールチェーンにインストールする必要があります。
- musl.ccから
muslツールチェーンをダウンロードします。これがお薦めです。ツールチェーンを任意のディレクトリに解凍します。このディレクトリは$TOOLCHAIN_DIRとして参照されます。 - 最新の
zlibライブラリ・ソースをここからダウンロードして解凍します。このガイドでは、zlib-1.2.11を使用します。 - 設定する環境変数
CC=$TOOLCHAIN_DIR/bin/gcc zlibディレクトリに移動し、次のコマンドを実行してzlibをコンパイルし、ツールチェーンにインストールします:./configure --prefix=$TOOLCHAIN_DIR --static make make install
静的なネイティブ・イメージのビルド
- 最初に、
PATH変数に$TOOLCHAIN_DIR/binが存在することを確認します。これを確認するには、次を実行します:x86_64-linux-musl-gcc次のような出力が表示されます:
x86_64-linux-musl-gcc: fatal error: no input files compilation terminated. - このコマンドを使用して、静的なネイティブ・イメージをビルドします:
native-image --static --libc=musl [other arguments] Class
ほぼ静的なネイティブ・イメージのビルド
GraalVMバージョン20.2以降では、libc以外のすべてを静的にリンクするほぼ静的なネイティブ・イメージをビルドできます。glibc以外のすべてのライブラリを静的にリンクすることで、アプリケーションがLinux glibcベースのディストリビューションで実行するために必要なライブラリがすべて存在することが保証されます。
ほぼ静的なネイティブ・イメージをビルドするには、このコマンドを使用します:
native-image -H:+StaticExecutableWithDynamicLibC [other arguments] Class
ノート: これは現在、
glibcでのみ機能します。
よくある質問
静的なネイティブ・イメージまたはほぼ静的なネイティブ・イメージをデプロイするために推奨されるベースDockerイメージは何ですか。
完全に静的なネイティブ・イメージでは、ベース・イメージを選択する際の柔軟性が最も高くなります。これは、FROM scratchイメージを含めあらゆるイメージで実行できます。ほぼ静的なネイティブ・イメージでは、glibcが提供されるコンテナ・イメージが必要ですが、それ以外の要件はありません。どちらのケースでも、ベース・イメージの選択は、主に特定のネイティブ・イメージで何が必要とされるかによって決まります。ランタイム・ライブラリの依存性を気にする必要はありません。