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 デバイスを公開できます。

手順

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

    1. 次の内容で 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 仕様をさらに調整する必要がある場合があります。

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

      $ oc apply -f fuse-builder-pod.yaml
  2. 以下のコマンドを使用して、Pod が実行されていることを確認します。

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

    1. fuse-builder-pod Pod が 実行 状態になったら、次のコマンドを実行して ビルドコンテナー 環境へのシェルセッションを開きます。

      $ oc exec -ti fuse-builder-pod -- /bin/bash

      現在地はコンテナーの中です。

    2. デフォルトの作業ディレクトリーは権限のないユーザーが書き込みできない可能性があるため、以下のコマンドを実行して、/tmp などの書き込み可能なディレクトリーに変更してください。

      $ cd /tmp
      $ pwd
      /tmp
  4. Podman を使用して Dockerfile を作成し、イメージをビルドします。

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

    1. サンプル 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
    2. 以下のコマンドを実行してイメージをビルドします。-t フラグはイメージにタグを付けます。

      $ podman build -t my-fuse-built-image:latest .

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

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

    fuse-builder-pod 内で、先ほど作成したイメージからコンテナーを起動してテストするには、次のコマンドを実行します。

    $ podman run --rm my-fuse-built-image:latest

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

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

    1. 作業が完了したら、以下のコマンドを実行して Pod 内のシェルセッションを終了してください。

      $ exit
    2. 不要になった Pod は、以下のコマンドを実行して削除してください。

      $ oc delete pod fuse-builder-pod
    3. 以下のコマンドを実行して、ローカルの YAML ファイルを削除します。

      $ rm fuse-builder-pod.yaml
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

会社概要

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

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

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

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

Legal Notice

Theme

© 2026 Red Hat
トップに戻る