静的なイメージおよびほぼ静的なイメージ
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
が提供されるコンテナ・イメージが必要ですが、それ以外の要件はありません。どちらのケースでも、ベース・イメージの選択は、主に特定のネイティブ・イメージで何が必要とされるかによって決まります。ランタイム・ライブラリの依存性を気にする必要はありません。