7.10. 使用 /dev/fuse 访问更快的构建


您可以使用 /dev/fuse 设备配置 pod,以启用更快、更有效的容器镜像构建,特别是针对非特权用户。此设备允许非特权 pod 挂载覆盖文件系统,这可通过 Podman 等工具利用。

7.10.1. 为 pod 中的非特权构建配置 /dev/fuse

通过将 /dev/fuse 设备公开给非特权 pod,您可以授予其在用户空间 (FUSE) 挂载中执行 Filesystem 的功能。这可以通过在 pod 定义中添加 io.kubernetes.cri-o.Devices: "/dev/fuse" 注解来实现。此设置允许 pod 中的非特权用户使用带有存储驱动程序的 podman 等工具,如 fuse-overlayfs,以安全且有效的方式模拟特权构建功能,而无需授予 pod 的完整特权访问权限。

流程

  1. 使用 /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" 
      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
      Copy to Clipboard Toggle word wrap
      1
      io.kubernetes.cri-o.Devices: "/dev/fuse" 注解使 FUSE 设备可用。
      2
      此注解指定一个容器,它使用包含 podman 的镜像(如 quay.io/podman/stable)。
      3
      此命令使容器保持运行,以便您可以 exec 到其中。
      4
      此注解指定一个以非特权用户运行容器的 securityContext (例如,runAsUser: 1000)。
      注意

      根据集群的安全上下文约束(SCC)或其他策略,您可能需要进一步调整 securityContext 规格,例如,如果只有 /dev/fuse 无法满足 fuse-overlayfs 的操作要求时允许特定容量。

    • 运行以下命令来创建 pod:

      $ oc apply -f fuse-builder-pod.yaml
      Copy to Clipboard Toggle word wrap
  2. 验证 Pod 是否在运行:

    $ oc get pods fuse-builder-pod
    Copy to Clipboard Toggle word wrap
  3. 访问 pod 并准备构建环境:

    fuse-builder-pod pod 处于 Running 状态后,在 build-container 环境中打开一个 shell 会话:

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

    您现在已在容器内。因为默认的工作目录可能无法被非特权用户写入,所以更改到 /tmp 等可写目录:

    $ cd /tmp
    $ pwd
    /tmp
    Copy to Clipboard Toggle word wrap
  4. 创建 dockerfile 并使用 Podman 构建镜像:

    在 pod 的 shell 和 /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
      Copy to Clipboard Toggle word wrap
    2. 使用 podman 构建镜像。-t 标志标记镜像:

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

      您应该会看到执行构建步骤的 Podman。

  5. 可选:测试构建的镜像:

    仍在 fuse-builder-pod 中,您可以从刚才构建的镜像中运行容器:

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

    这应该输出 /app/build_info.txt 文件的内容以及复制的 Dockerfile。

  6. 退出 pod 并清理:

    • 完成后,退出 pod 中的 shell 会话:

      $ exit
      Copy to Clipboard Toggle word wrap
    • 然后,如果不再需要 pod,可以删除它:

      $ oc delete pod fuse-builder-pod
      Copy to Clipboard Toggle word wrap
    • 删除本地 YAML 文件:

      $ rm fuse-builder-pod.yaml
      Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat