如何在OpenShift 4.11中运行无特权Rootless Podman?
在OpenShift 4.11中解决Rootless Podman构建时无法创建/.local目录的问题
核心原因
OpenShift的安全上下文约束(SCC)与用户ID映射机制和普通虚拟机环境存在差异:podman用户在容器内没有根目录写入权限,但Rootless Podman默认会尝试在/.local路径存储运行状态,最终触发权限不足报错。
解决方案步骤
1. 调整Podman容器的存储路径与用户ID
运行Podman容器时,显式指定存储目录到OpenShift允许写入的路径(如/tmp),同时匹配你已配置的UID范围:
podman run -u 1001:1001 \ -v /tmp/podman-storage:/tmp/.local/share/containers \ quay.io/podman/stable \ sh -c "echo 'FROM busybox' > /tmp/Dockerfile && echo 'RUN echo hello' >> /tmp/Dockerfile && podman build --root /tmp/.local/share/containers -t test /tmp/."
-u 1001:1001:指定与命名空间补丁匹配的UID/GID-v /tmp/podman-storage:/tmp/.local/share/containers:将Podman存储目录挂载到容器内可写的/tmp路径--root /tmp/.local/share/containers:强制Podman使用指定存储根目录,规避默认写入/.local的行为
2. 补充SCC权限配置
除已有的UID/GID范围补丁,需给命名空间内的服务账号添加对应SCC权限:
oc adm policy add-scc-to-group anyuid system:serviceaccounts:gitlab-dev
若需更精细的权限控制,可创建自定义SCC:
apiVersion: security.openshift.io/v1 kind: SecurityContextConstraints metadata: name: podman-rootless-scc allowPrivilegeEscalation: false allowedCapabilities: [] fsGroup: type: MustRunAs ranges: - min: 1001 max: 101000 runAsUser: type: MustRunAsRange uidRangeMin: 1001 uidRangeMax: 101000 seLinuxContext: type: MustRunAs supplementalGroups: type: MustRunAs ranges: - min: 1001 max: 101000 volumes: - configMap - emptyDir - projected - secret - downwardAPI - persistentVolumeClaim
绑定到服务账号:
oc create -f podman-rootless-scc.yaml oc adm policy add-scc-to-group podman-rootless-scc system:serviceaccounts:gitlab-dev
3. 推荐:使用OpenShift原生BuildConfig替代Podman构建
如果无需在容器内运行Podman,更符合OpenShift最佳实践的方式是用BuildConfig完成镜像构建:
apiVersion: build.openshift.io/v1 kind: BuildConfig metadata: name: test-build namespace: gitlab-dev spec: source: dockerfile: | FROM busybox RUN echo hello strategy: dockerStrategy: {} output: to: kind: ImageStreamTag name: test:latest
触发构建:
oc start-build test-build
该方式完全依托OpenShift原生构建机制,从根源规避Rootless Podman的权限适配问题。
验证
执行上述步骤后,重新运行构建命令,检查是否成功生成镜像且无权限报错。
内容的提问来源于stack exchange,提问作者uniwinux
相关产品推荐
相关产品推荐

