静的なイメージおよびほぼ静的なイメージ

GraalVMネイティブ・イメージでは、目的に応じて、静的なイメージまたはほとんど静的なイメージを作成できます。

静的なネイティブ・イメージとは、静的にリンクされたバイナリのことであり、追加のライブラリ依存性なしに使用できます。これにより、配布しやすくなり、スリムすなわちdistrolessのコンテナ・イメージにデプロイしやすくなります。これらは、静的にmusl-libc (軽量、高速かつ単純なlibc実装)をリンクすることで作成されます。

ほとんど静的なイメージは、libc以外のすべてのライブラリを静的にリンクします。このアプローチは、そのようなネイティブ・イメージをdistrolessコンテナ・イメージにデプロイする場合に最適です。現在は、glibcをリンクする場合のみ機能することに注意してください。

前提条件

準備

最初にmuslツールチェーンを取得してから、zlibをコンパイルしてツールチェーンにインストールする必要があります。

  1. musl.ccからmuslツールチェーンをダウンロードします。これがお薦めです。ツールチェーンを任意のディレクトリに解凍します。このディレクトリは$TOOLCHAIN_DIRとして参照されます。
  2. 最新のzlibライブラリ・ソースをここからダウンロードして解凍します。このガイドでは、zlib-1.2.11を使用します。
  3. 設定する環境変数
     CC=$TOOLCHAIN_DIR/bin/gcc
    
  4. zlibディレクトリに移動し、次のコマンドを実行してzlibをコンパイルし、ツールチェーンにインストールします:
     ./configure --prefix=$TOOLCHAIN_DIR --static
     make
     make install
    

静的なネイティブ・イメージのビルド

  1. 最初に、PATH変数に$TOOLCHAIN_DIR/binが存在することを確認します。これを確認するには、次を実行します:
     x86_64-linux-musl-gcc
    

    次のような出力が表示されます:

     x86_64-linux-musl-gcc: fatal error: no input files
     compilation terminated.
    
  2. このコマンドを使用して、静的なネイティブ・イメージをビルドします:
     native-image --static --libc=musl [other arguments] Class
    

ほぼ静的なネイティブ・イメージのビルド

GraalVMバージョン20.2以降では、libc以外のすべてを静的にリンクするほぼ静的なネイティブ・イメージをビルドできます。glibc以外のすべてのライブラリを静的にリンクすることで、アプリケーションがLinux glibcベースのディストリビューションで実行するために必要なライブラリがすべて存在することが保証されます。

ほぼ静的なネイティブ・イメージをビルドするには、このコマンドを使用します:

native-image -H:+StaticExecutableWithDynamicLibC [other arguments] Class

ノート: これは現在、glibcでのみ機能します。

よくある質問

完全に静的なネイティブ・イメージでは、ベース・イメージを選択する際の柔軟性が最も高くなります。これは、FROM scratchイメージを含めあらゆるイメージで実行できます。ほぼ静的なネイティブ・イメージでは、glibcが提供されるコンテナ・イメージが必要ですが、それ以外の要件はありません。どちらのケースでも、ベース・イメージの選択は、主に特定のネイティブ・イメージで何が必要とされるかによって決まります。ランタイム・ライブラリの依存性を気にする必要はありません。