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