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
Chuma Takahiro