BuildKit を使用した nerdctl build のセットアップ
nerdctl build (および nerdctl compose build) は BuildKit に依存しています。
これを使用するには、BuildKit をセットアップする必要があります。
BuildKit には 2 種類のバックエンドがあります。
- containerd worker: BuildKit はコンテナやイメージなどの管理を containerd に依存しています。 containerd はホスト上で稼働している必要があります。
- OCIワーカー: BuildKitはコンテナやイメージなどを管理します。 containerdは必要ありません。このワーカーは、コンテナーの実行を runc に依存しています。
上記のいずれかのワーカーで BuildKit を設定する必要があります。
OCIワーカーは、containerdによって管理されるベース・イメージ(Dockerfile内のFROMイメージ)にアクセスできないことに注意してください。
したがって、nerdctl build で containerd マネージド イメージを基本イメージとして使用することはできません。
これらには、以前に nerdctl build を使用してビルドされたイメージが含まれます。
たとえば、次のビルド・バーは、以前にビルドされ、コンテナ管理されたイメージfooを使用しようとするため、OCI Workerで失敗します。
$ mkdir -p /tmp/ctx && cat <<EOF > /tmp/ctx/Dockerfile
FROM ghcr.io/stargz-containers/ubuntu:20.04-org
RUN echo hello
EOF
$ nerdctl build -t foo /tmp/ctx
$ cat <<EOF > /tmp/ctx/Dockerfile
FROM foo
RUN echo bar
EOF
$ nerdctl build -t bar /tmp/ctx
この制限は、後述するようにcontainerd workerを使用することで回避できます。
containerd worker を使用した BuildKit のセットアップ
ルートレス
| nerdctl >= 0.18, BuildKit >= 0.10 | |
|---|---|
containerd-rootless-setuptool.sh は envvars CONTAINERD_NAMESPACEとCONTAINERD_SNAPSHOTTERを認識しています。
指定された containerd 名前空間に buildkitd をインストールします。
これにより、BuildKit は、その名前空間の containerd マネージドイメージをベースイメージとして使用できます。
現時点では、BuildKit は他の名前空間のイメージを使用できないことに注意してください。
If CONTAINERD_NAMESPACE envvar is not specified, this script configures buildkitd to use "buildkit" namespace (not "default" namespace).
CONTAINERD_NAMESPACE で名前空間を指定してこのスクリプトを実行することで、別の名前空間に追加の buildkitd プロセスをインストールできます。
CONTAINERD_NAMESPACEが指定されている場合、BuildKit は $XDG_RUNTIME_DIR/buildkit-$CONTAINERD_NAMESPACE/buildkitd.sock でソケットを公開します。
CONTAINERD_NAMESPACEが指定されていない場合、その場所は $XDG_RUNTIME_DIR/buildkit/buildkitd.sock になります。
Rootful
次に、次の構成を /etc/buildkit/buildkitd.toml に追加して、containerd worker を有効にします。
[worker.oci]
  enabled = false
[worker.containerd]
  enabled = true
  # namespace should be "k8s.io" for Kubernetes (including Rancher Desktop)
  namespace = "default"
OCI WorkerでのBuildKitの設定
ルートレス
上記で述べたように、この構成の BuildKit では containerd で管理されているイメージを使用できません。
これらには、以前に nerdctl build でビルドされたイメージが含まれます。
BuildKit は $XDG_RUNTIME_DIR/buildkit/buildkitd.sock でソケットを公開します。
rootful
nerdctlはどのBuildKitソケットを使用しますか?
nerdctl ビルドの BuildKit アドレスは、--buildkit-host フラグまたは BUILDKIT_HOST envvarを使用して指定します。
BuildKit アドレスが指定されていない場合、nerdctl はいくつかのデフォルトの BuildKit アドレスを次の順序で試行し、最初に使用可能なアドレスを使用します。
- <runtime directory>/buildkit-<current namespace>/buildkitd.sock
- <runtime directory>/buildkit-default/buildkitd.sock
- <runtime directory>/buildkit/buildkitd.sock
たとえば、rootless nerdctl を test containerd 名前空間で実行すると、デフォルトで $XDG_RUNTIME_DIR/buildkit-test/buildkitd.sock を使用し、次に $XDG_RUNTIME_DIR/buildkit-default/buildkitd.sock と$XDG_RUNTIME_DIR/buildkit/buildkitd.sock にフォールバックしようとします。