Skip to content

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_NAMESPACE=default containerd-rootless-setuptool.sh install-buildkit-containerd

containerd-rootless-setuptool.shenvvars CONTAINERD_NAMESPACECONTAINERD_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

$ sudo systemctl enable --now buildkit

次に、次の構成を /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の設定

ルートレス

$ containerd-rootless-setuptool.sh install-buildkit

上記で述べたように、この構成の BuildKit では containerd で管理されているイメージを使用できません。 これらには、以前に nerdctl build でビルドされたイメージが含まれます。

BuildKit は $XDG_RUNTIME_DIR/buildkit/buildkitd.sock でソケットを公開します。

rootful

$ sudo systemctl enable --now buildkit

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 にフォールバックしようとします。