kubernetesコンテナイメージのローカルビルド

kubernetesのコンテナイメージはOCI標準と互換性があります。
Dockerにはイメージビルドツールが付属していますが、kubernetesの場合には、 buildkitなどを利用します。

buildkitはdockerの派生プロジェクトですが単体で利用できます。
ディストリビューションのパッケージがないケースが多々あるため、インストールはGitHubのReleases配布バイナリをダウンロードして、実行ファイルをPATHのとおったディレクトリに置きます。

buildkitはクライアント・サーバ構成になっているため、あらかじめサーバプロセスを起動しておきます。

なお、素朴なセットアップでは全般的にroot権限を求められるため、sudo経由で実行する必要があるでしょう。

$ sudo buildkitd &

buildctlでイメージ作成

イメージビルドのクライアントはbuildctl buildコマンドです。
docker buildに相当するコマンドで、コンテキストとDockerfileを入力に用いる点は同じです。
ただし拡張性のため、明示的に指定すべきオプションが多数あります。

$ sudo buildctl build \
  --frontend dockerfile.v0 \
  --local context=. --local dockerfile=. \
  --output type=oci,name=<some-image-name> \
  > <export-file>.tar

カレントディレクトリのDockerfileからビルドするケースでは、--frontend--localオプションは上のとおりです。

--outputオプションではイメージの形式と名前を指定します。
アウトプットはリダイレクトでtarファイルに出力します。ファイル名はインポート時に指定するだけの用途であり、大きな意味はもちません。

kubernetesクラスタにインポート

各クラスタ実装のコマンドでイメージをインポートします。
k3sの場合k3s ctr images importコマンドです。

$ sudo k3s ctr images import <export-file>.tar

imageの名称はbuildctl buildで指定した名前が使われます。また、暗黙にdocker.io/のprefixが付きました。

インポート後は、コンテナのimageに指定して利用できます。ただし、imagePullPolicy: Neverなどを指定しないと、docker.ioを探索して失敗する場合があります。

buildkitdの停止

ビルド作業を完了してbuildkitdを停止したい場合は、killallコマンドを利用できます。

$ sudo killall buildkitd
⁋ 2022/04/04↻ 2024/12/18
中馬崇尋
Chuma Takahiro