7.10. /dev/fuse を使用した高速ビルドへのアクセス
/dev/fuse デバイスを使用して Pod を設定すると、特に権限のないユーザー向けに、より高速で効率的なコンテナーイメージビルドが可能になります。このデバイスを使用すると、特権を持たない Pod がオーバーレイファイルシステムをマウントできるようになり、Podman などのツールで活用できます。
7.10.1. Pod 内の特権のないビルド用に /dev/fuse を設定する リンクのコピーリンクがクリップボードにコピーされました!
/dev/fuse デバイスを公開することで、特権を持たない Pod に Filesystem in Userspace (FUSE) マウントを実行する機能を付与できます。この設定により、Pod 内の非特権ユーザーは、Pod への完全な特権アクセスを許可することなく、特権ビルド機能を安全かつ効率的な方法で模倣することで、podman などのツールと fuse-overlayfs などのストレージドライバーを使用できます。
Pod 定義に io.kubernetes.cri-o.Devices: "/dev/fuse" アノテーションを追加することで 、/dev/fuse デバイスを公開できます。
手順
/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ここでは、以下のようになります。
metadata.annotations-
io.kubernetes.cri-o.Devices: "/dev/fuse"アノテーションにより、FUSE デバイスが利用可能になることを指定します。 仕様コンテナーイメージ-
podmanを含むイメージを使用するコンテナーを指定します (例:quay.io/podman/stable)。 仕様コンテナー引数-
コンテナーを実行状態に保ち、そのコンテナーに
exec コマンドでアクセスできるようにするコマンドを指定します。 spec.containers.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 が実行状態になったら、次のコマンドを実行してビルドコンテナー環境へのシェルセッションを開きます。$ oc exec -ti fuse-builder-pod -- /bin/bash現在地はコンテナーの中です。
デフォルトの作業ディレクトリーは権限のないユーザーが書き込みできない可能性があるため、以下のコマンドを実行して、
/tmpなどの書き込み可能なディレクトリーに変更してください。$ cd /tmp$ pwd/tmp
Podman を使用して Dockerfile を作成し、イメージをビルドします。
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"] EOF以下のコマンドを実行してイメージをビルドします。
-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