我正在使用无根 Podman 容器来运行 php+apache 镜像。
我的容器设置涉及将目录从主机映射到容器(~/foo:/var/www/html/foo
)。容器内的用户是root
,但容器内的 Apache 以 的身份运行www-data
。
如果我不设置,UserNS
那么我允许用户www-data
访问foo
目录的唯一方法就是设置o+rx
。
如果我设置UserNS
为keep-id
或keep-id:uid:33,gid:33
(33 是 www-data 的 uid),那么 Apache 会抱怨它无法绑定到端口 80(在容器内)。
有没有办法解决这个问题,而无需设置o+rx
foo 目录或更改 apache 端口?
答案1
我已经为我的实现解决了这个问题。我的问题是,我映射的卷的源已安装到网络资源。我将源移动到本地文件系统,所有问题立即得到解决。当我尝试在卷上使用 Z 选项时,我被指向这个方向,而 podman 无法设置属性。我是 RHEL 8.9 上的无根 podman。
答案2
如果你添加了的话会起作用吗--user 0:0
?
--user 0:0
当我添加时,它对我有用--userns keep-id:uid=48,gid=48
。我刚刚测试了 apache(不是 php)。这是一个演示(使用无根 Podman)。
- 创造Dockerfile内容如下:
FROM docker.io/library/fedora RUN dnf -y update && dnf install -y httpd procps-ng && dnf clean all CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
- 构建映像
podman build -t apache .
- 创建目录〜/ foo
mkdir ~/foo
- 创建文件〜/ foo /文件.txt
echo hello > ~/foo/file.txt
- 限制权限
chmod 700 ~/foo chmod 700 ~/foo/file.txt
- 启动 Apache
podman 命令开始运行。打印以下警告:podman run --name myapache --rm -ti \ --userns keep-id:uid=48,gid=48 \ --user 0:0 -v ~/foo:/var/www/html/foo:Z \ -p 8080:80 localhost/apache
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.0.2.100. Set the 'ServerName' directive globally to suppress this message
- 在另一个 shell 运行中
此文本已打印curl localhost:8080/foo/file.txt
hello
- 检查容器进程的所有权。运行命令
该命令打印以下输出podman exec myapache ps axu
第一个容器进程由根但子进程由阿帕奇USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.1 0.5 40844 10188 pts/0 Ss+ 02:27 0:00 /usr/sbin/httpd -DFOREGROUND apache 2 0.0 0.3 41148 6468 pts/0 S+ 02:27 0:00 /usr/sbin/httpd -DFOREGROUND apache 3 0.0 0.4 1135840 9056 pts/0 Sl+ 02:27 0:00 /usr/sbin/httpd -DFOREGROUND apache 4 0.0 0.4 1003744 8024 pts/0 Sl+ 02:27 0:00 /usr/sbin/httpd -DFOREGROUND apache 80 0.0 0.4 1003744 8024 pts/0 Sl+ 02:27 0:00 /usr/sbin/httpd -DFOREGROUND root 185 0.0 0.1 7740 3872 ? R 02:28 0:00 ps axu
附注:
如果--user 0:0
从步骤 6 中的命令中删除,则 podman 命令将失败并显示错误消息:
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.0.2.100. Set the 'ServerName' directive globally to suppress this message
(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
no listening sockets available, shutting down
AH00015: Unable to open logs