无根 Podman 容器和映射卷的权限问题

无根 Podman 容器和映射卷的权限问题

我正在使用无根 Podman 容器来运行 php+apache 镜像。

我的容器设置涉及将目录从主机映射到容器(~/foo:/var/www/html/foo)。容器内的用户是root,但容器内的 Apache 以 的身份运行www-data

如果我不设置,UserNS那么我允许用户www-data访问foo目录的唯一方法就是设置o+rx

如果我设置UserNSkeep-idkeep-id:uid:33,gid:33(33 是 www-data 的 uid),那么 Apache 会抱怨它无法绑定到端口 80(在容器内)。

有没有办法解决这个问题,而无需设置o+rxfoo 目录或更改 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)。

  1. 创造Dockerfile内容如下:
    FROM docker.io/library/fedora
    RUN dnf -y update && dnf install -y httpd procps-ng && dnf clean all
    CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
    
  2. 构建映像
    podman build -t apache .
    
  3. 创建目录〜/ foo
    mkdir ~/foo
    
  4. 创建文件〜/ foo /文件.txt
    echo hello > ~/foo/file.txt
    
  5. 限制权限
    chmod 700 ~/foo
    chmod 700 ~/foo/file.txt
    
  6. 启动 Apache
    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
    
    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
    
  7. 在另一个 shell 运行中
    curl localhost:8080/foo/file.txt
    
    此文本已打印
    hello
    
  8. 检查容器进程的所有权。运行命令
    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

相关内容