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