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 などのストレージドライバーとともに使用できるようになります。

手順

  1. /dev/fuse アクセスを持つ Pod を定義します。

    • 次の内容で fuse-builder-pod.yaml という名前の YAML ファイルを作成します。

      Copy to Clipboard Toggle word wrap
      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
      1
      io.kubernetes.cri-o.Devices: "/dev/fuse" アノテーションにより、Fuse デバイスが利用可能になります。
      2
      このアノテーションは、podman が含まれるイメージ (例: quay.io/podman/stable) を使用するコンテナーを指定します。
      3
      このコマンドはコンテナーを実行したままにして、コンテナー内で exec できるようにします。
      4
      このアノテーションは、コンテナーを権限のないユーザーとして実行する securityContext を指定します (例: runAsUser: 1000)*。
      注記

      クラスターの Security Context Constraints (SCC) またはその他のポリシーに応じて、たとえば、fuse-overlayfs が動作するために /dev/fuse だけでは不十分な場合に特定のケイパビリティーを許可するなど、securityContext 仕様をさらに調整する必要がある場合があります。

    • 以下のコマンドを実行して Pod を作成します。

      Copy to Clipboard Toggle word wrap
      $ oc apply -f fuse-builder-pod.yaml
  2. Pod が実行されていることを確認します。

    Copy to Clipboard Toggle word wrap
    $ oc get pods fuse-builder-pod
  3. Pod にアクセスし、ビルド環境を準備します。

    fuse-builder-pod Pod が Running 状態になったら、build-container 環境にシェルセッションを開きます。

    Copy to Clipboard Toggle word wrap
    $ oc exec -ti fuse-builder-pod -- /bin/bash

    現在地はコンテナーの中です。デフォルトの作業ディレクトリーは権限のないユーザーによる書き込みが不可能な場合があるため、/tmp などの書き込み可能なディレクトリーに変更します。

    Copy to Clipboard Toggle word wrap
    $ cd /tmp
    $ pwd
    /tmp
  4. dockerfile を作成し、Podman を使用してイメージをビルドします。

    Pod のシェル内および /tmp ディレクトリー内で、Dockerfile を作成し、podman を使用してコンテナーイメージをビルドできるようになりました。fuse-overlayfs がデフォルトの、または設定されたストレージドライバーである場合、Podman は利用可能な /dev/fuse デバイスで fuse-overlayfs を活用できます。

    1. サンプル Dockerfile を作成します。

      Copy to Clipboard Toggle word wrap
      $ 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
    2. podman を使用してイメージをビルドします。-t フラグはイメージにタグを付けます。

      Copy to Clipboard Toggle word wrap
      $ podman build -t my-fuse-built-image:latest .

      Podman がビルド手順を実行していることを確認できるはずです。

  5. オプション: ビルドしたイメージをテストします。

    引き続き fuse-builder-pod 内で、先ほどビルドしたイメージからコンテナーを実行してテストできます。

    Copy to Clipboard Toggle word wrap
    $ podman run --rm my-fuse-built-image:latest

    これにより、/app/build_info.txt ファイルとコピーされた Dockerfile の内容が出力されます。

  6. Pod を終了してクリーンアップします。

    • 完了したら、Pod のシェルセッションを終了します。

      Copy to Clipboard Toggle word wrap
      $ exit
    • 不要になった Pod は削除できます。

      Copy to Clipboard Toggle word wrap
      $ oc delete pod fuse-builder-pod
    • ローカル YAML ファイルを削除します。

      Copy to Clipboard Toggle word wrap
      $ rm fuse-builder-pod.yaml
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat, Inc.