7.10. /dev/fuse を使用した高速ビルドへのアクセス
/dev/fuse デバイスを使用して Pod を設定すると、特に権限のないユーザー向けに、より高速で効率的なコンテナーイメージビルドが可能になります。このデバイスにより、権限のない Pod がオーバーレイファイルシステムをマウントできるようになり、Podman などのツールで活用できるようになります。
7.10.1. Pod 内の特権のないビルド用に /dev/fuse を設定する リンクのコピーリンクがクリップボードにコピーされました!
/dev/fuse デバイスを権限のない Pod に公開すると、Filesystem in Userspace (Fuse) マウントを実行するケイパビリティーが付与されます。そのためには、Pod 定義に io.kubernetes.cri-o.Devices: "/dev/fuse" アノテーションを追加します。この設定により、Pod 内の権限のないユーザーは、Pod への完全な権限アクセスを許可せずに、権限のあるビルドケイパビリティーを安全かつ効率的に模倣することで、podman などのツールを fuse-overlayfs などのストレージドライバーとともに使用できるようになります。
手順
/dev/fuseアクセスを持つ Pod を定義します。次の内容で
fuse-builder-pod.yamlという名前の YAML ファイルを作成します。apiVersion: v1 kind: Pod metadata: name: fuse-builder-pod annotations: io.kubernetes.cri-o.Devices: "/dev/fuse" spec: containers: - name: build-container image: quay.io/podman/stable command: ["/bin/sh", "-c"] args: ["echo 'Container is running. Use oc exec to get a shell.'; sleep infinity"] securityContext: runAsUser: 1000ここでは、以下のようになります。
io.kubernetes.cri-o.Devices-
io.kubernetes.cri-o.Devices: "/dev/fuse"アノテーションにより、Fuse デバイスが利用可能になります。 image-
このアノテーションは、
podmanが含まれるイメージ (例:quay.io/podman/stable) を使用するコンテナーを指定します。 args-
このコマンドはコンテナーを実行したままにして、コンテナー内で
execできるようにします。 securityContextこのアノテーションは、コンテナーを権限のないユーザーとして実行する
securityContextを指定します (例:runAsUser: 1000)。注記クラスターの Security Context Constraints (SCC) またはその他のポリシーに応じて、たとえば、
fuse-overlayfsが動作するために/dev/fuseだけでは不十分な場合に特定のケイパビリティーを許可するなど、securityContext仕様をさらに調整する必要がある場合があります。
以下のコマンドを実行して Pod を作成します。
$ oc apply -f fuse-builder-pod.yaml
Pod が実行されていることを確認します。
$ oc get pods fuse-builder-podPod にアクセスし、ビルド環境を準備します。
fuse-builder-podPod がRunning状態になったら、build-container環境にシェルセッションを開きます。$ oc exec -ti fuse-builder-pod -- /bin/bash現在地はコンテナーの中です。デフォルトの作業ディレクトリーは権限のないユーザーによる書き込みが不可能な場合があるため、
/tmpなどの書き込み可能なディレクトリーに変更します。$ cd /tmp$ pwd/tmpdockerfile を作成し、Podman を使用してイメージをビルドします。
Pod のシェル内および
/tmpディレクトリー内で、Dockerfileを作成し、podmanを使用してコンテナーイメージをビルドできるようになりました。fuse-overlayfsがデフォルトの、または設定されたストレージドライバーである場合、Podman は利用可能な/dev/fuseデバイスでfuse-overlayfsを活用できます。サンプル
Dockerfileを作成します。$ cat > Dockerfile <<EOF FROM registry.access.redhat.com/ubi9/ubi-minimal RUN microdnf install -y findutils && microdnf clean all RUN echo "This image was built inside a pod with /dev/fuse by user $(id -u)" > /app/build_info.txt COPY Dockerfile /app/Dockerfile_copied WORKDIR /app CMD ["sh", "-c", "cat /app/build_info.txt && echo '--- Copied Dockerfile ---' && cat /app/Dockerfile_copied"] EOFpodmanを使用してイメージをビルドします。-tフラグはイメージにタグを付けます。$ podman build -t my-fuse-built-image:latest .Podman がビルド手順を実行していることを確認できるはずです。
オプション: ビルドしたイメージをテストします。
引き続き
fuse-builder-pod内で、先ほどビルドしたイメージからコンテナーを実行してテストできます。$ podman run --rm my-fuse-built-image:latestこれにより、
/app/build_info.txtファイルとコピーされた Dockerfile の内容が出力されます。Pod を終了してクリーンアップします。
完了したら、Pod のシェルセッションを終了します。
$ exit不要になった Pod を削除します。
$ oc delete pod fuse-builder-podローカル YAML ファイルを削除します。
$ rm fuse-builder-pod.yaml