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 ファイルを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
apiVersion: v1 kind: Pod metadata: name: fuse-builder-pod annotations: io.kubernetes.cri-o.Devices: "/dev/fuse"
1 spec: containers: - name: build-container image: quay.io/podman/stable
2 command: ["/bin/sh", "-c"] args: ["echo 'Container is running. Use oc exec to get a shell.'; sleep infinity"]
3 securityContext:
4 runAsUser: 1000
注記クラスターの Security Context Constraints (SCC) またはその他のポリシーに応じて、たとえば、
fuse-overlayfs
が動作するために/dev/fuse
だけでは不十分な場合に特定のケイパビリティーを許可するなど、securityContext
仕様をさらに調整する必要がある場合があります。以下のコマンドを実行して Pod を作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc apply -f fuse-builder-pod.yaml
$ oc apply -f fuse-builder-pod.yaml
Pod が実行されていることを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc get pods fuse-builder-pod
$ oc get pods fuse-builder-pod
Pod にアクセスし、ビルド環境を準備します。
fuse-builder-pod
Pod がRunning
状態になったら、build-container
環境にシェルセッションを開きます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc exec -ti fuse-builder-pod -- /bin/bash
$ oc exec -ti fuse-builder-pod -- /bin/bash
現在地はコンテナーの中です。デフォルトの作業ディレクトリーは権限のないユーザーによる書き込みが不可能な場合があるため、
/tmp
などの書き込み可能なディレクトリーに変更します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow cd /tmp pwd
$ cd /tmp $ pwd /tmp
dockerfile を作成し、Podman を使用してイメージをビルドします。
Pod のシェル内および
/tmp
ディレクトリー内で、Dockerfile
を作成し、podman
を使用してコンテナーイメージをビルドできるようになりました。fuse-overlayfs
がデフォルトの、または設定されたストレージドライバーである場合、Podman は利用可能な/dev/fuse
デバイスでfuse-overlayfs
を活用できます。サンプル
Dockerfile
を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
$ 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
podman
を使用してイメージをビルドします。-t
フラグはイメージにタグを付けます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow podman build -t my-fuse-built-image:latest .
$ podman build -t my-fuse-built-image:latest .
Podman がビルド手順を実行していることを確認できるはずです。
オプション: ビルドしたイメージをテストします。
引き続き
fuse-builder-pod
内で、先ほどビルドしたイメージからコンテナーを実行してテストできます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow podman run --rm my-fuse-built-image:latest
$ podman run --rm my-fuse-built-image:latest
これにより、
/app/build_info.txt
ファイルとコピーされた Dockerfile の内容が出力されます。Pod を終了してクリーンアップします。
完了したら、Pod のシェルセッションを終了します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow exit
$ exit
不要になった Pod は削除できます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete pod fuse-builder-pod
$ oc delete pod fuse-builder-pod
ローカル YAML ファイルを削除します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow rm fuse-builder-pod.yaml
$ rm fuse-builder-pod.yaml