This documentation is for a release that is no longer maintained
See documentation for the latest supported version 3 or the latest supported version 4.4.18. 以非 root 用户身份使用 Buildah 构建容器镜像
作为 root 用户在容器上运行 Pipelines,可以将容器进程和主机公开给其他潜在的恶意资源。您可以作为容器中的特定非 root 用户运行工作负载来降低此类风险。要以非 root 用户身份使用 Buildah 运行容器镜像的构建,可以执行以下步骤:
- 定义自定义服务帐户 (SA) 和安全性上下文约束 (SCC)。
-
配置 Buildah,以使用 ID 为
1000
的build
用户。 - 使用自定义配置映射启动任务运行,或将其与管道运行集成。
4.18.1. 配置自定义服务帐户和安全上下文约束 复制链接链接已复制到粘贴板!
默认 pipeline
SA 允许使用命名空间范围之外的用户 ID。要减少对默认 SA 的依赖性,您可以为 ID 为 1000
的 build
用户定义具有必要的集群角色和角色绑定的自定义 SA 和 SCC。
目前,Buildah 需要启用 allowPrivilegeEscalation
设置,才能在容器中运行。通过这个设置,Buildah 可以在以非 root 用户身份运行时利用 SETUID
和 SETGID
功能。
流程
使用必要的集群角色和角色绑定创建自定义 SA 和 SCC。
示例:用户 id 为
1000
的自定义 SA 和 SCC。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.18.2. 配置 Buildah 以使用 build 用户 复制链接链接已复制到粘贴板!
您可以定义一个 Buildah 任务,以使用带有用户 ID 1000
的 build
用户。
流程
作为普通任务,创建
buildah
集群任务的副本。oc get clustertask buildah -o yaml | yq '. |= (del .metadata |= with_entries(select(.key == "name" )))' | yq '.kind="Task"' | yq '.metadata.name="buildah-as-user"' | oc create -f -
$ oc get clustertask buildah -o yaml | yq '. |= (del .metadata |= with_entries(select(.key == "name" )))' | yq '.kind="Task"' | yq '.metadata.name="buildah-as-user"' | oc create -f -
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑复制的
buildah
任务。oc edit task buildah-as-user
$ oc edit task buildah-as-user
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例:使用
build
用户修改 Buildah 任务Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.18.3. 使用自定义配置映射或管道运行启动任务运行 复制链接链接已复制到粘贴板!
定义自定义 Buildah 集群任务后,您可以创建一个 TaskRun
对象,该对象以 build
用户,使用用户 id 1000
来构建镜像。另外,您还可以将 TaskRun
对象集成为 PipelineRun
对象的一部分。
流程
使用自定义
ConfigMap
和Dockerfile
对象创建一个TaskRun
对象。示例:以用户 ID
1000
身份运行 Buildah 的任务运行Copy to Clipboard Copied! Toggle word wrap Toggle overflow (可选)创建管道和对应的管道运行。
示例:管道和对应的管道运行
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 启动任务运行或管道运行。
4.18.4. 无特权构建的限制 复制链接链接已复制到粘贴板!
无特权构建的进程可用于大多数 Dockerfile
对象。但是,一些已知的限制可能会导致构建失败:
-
由于缺少必要权限问题,使用
--mount=type=cache
选项可能会失败。如需更多信息,请参阅本文档。 -
使用
--mount=type=secret
选项会失败,因为挂载资源需要未由自定义 SCC 提供的额外功能。
其他资源