我正在尝试运行podman
由 kubernetes YML 文件定义的 quadlet。我希望它在主机上的用户systemd
下以无根方式运行: 。web
systemctl --user status pod-web
在容器内部,PHP 进程以33:33
用户身份运行。我希望/home/web/data
主机上的目录归用户所有web
,但同时在33:33
容器内部,该目录可由用户读取和写入,容器被挂载到/var/www/html
。
在评论中,你可以看到我尝试的一些方法。不幸的是,我对用户命名空间和subuid/subgid了解不够,无法使其与文档配合使用,而 Copilot 一直在产生幻觉,因此任何来自真人的帮助都将不胜感激。
我的问题与这个类似,但我想使用podman kube
YML 文件中定义的四元组。
环境:
AlmaLinux release 9.4 (Seafoam Ocelot)
podman version 4.9.4-rhel
systemd 252 (252-32.el9_4.7)
- SELinux 启用强制
chown -R web:web /home/web
usermod --add-subuids 100000-165535 --add-subgids 100000-165535 web
/home/web/pod-web.yml
:
apiVersion: v1
kind: Pod
metadata:
name: pod-web
# annotations:
# io.podman.annotations.userns: "keep-id"
spec:
containers:
- name: pod-web
image: docker.io/library/php:8.3-apache
# securityContext:
# runAsUser: 33
# runAsGroup: 33
# supplementalGroups: [65536]
# ports:
# - containerPort: 80
# hostPort: 8000
volumeMounts:
- mountPath: /var/www/html
name: web-data
volumes:
- name: web-data
hostPath:
path: /home/web/data
restartPolicy: Always
使用runAsUser: 33
容器记录:
(13)Permission denied: AH00072: make_sock: could not bind to address [::]:80
(13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:80
容器runAsUser: 0
似乎可以运行,但如果我理解正确的话,这是一种不好的做法,因为它赋予了太多特权。
/home/web/.config/containers/systemd/pod-web.kube
:
[Unit]
Description=Podman Quadlet: %p
[Service]
# ExecStartPre=/usr/bin/podman unshare -- /bin/bash -c 'chown -R 33:33 /home/web/data'
[Kube]
Yaml=/home/web/%p.yml
LogDriver=journald
#UserNS=keep-id:uid=33,gid=33
#UserNS=auto
[Install]
WantedBy=multi-user.target default.target
最终的效果如下:
chown -R web:web /home/web
usermod --add-subuids 100000-165535 --add-subgids 100000-165535 web
/home/web/pod-web.yml
:/home/web/.config/containers/systemd/pod-web.kube
:%p
将被替换为pod-web
文件名中的特别是,
(13)Permission denied: AH00072: make_sock: could not bind to address
解决了securityContext:capabilities:add:["NET_BIND_SERVICE"]