当 apache 在 docroot 中创建文件时,docker 卷权限被拒绝问题

当 apache 在 docroot 中创建文件时,docker 卷权限被拒绝问题

我创建了一个包含 apache 的 docker 镜像。在将该镜像运行到容器中时,apache 根进程以 身份运行root,子进程以 身份运行www-data。一个 docker 卷(在 Dockerfile 中定义的卷)被创建为,并/app/cache/example在 apache 中配置为 docroot。

在容器中运行的 Apache 实际上从后端 http 端点之一呈现数据并在 apache docroot 中缓存静态资产。

但问题是 apache 无法将静态资产写入 docker 卷,权限被拒绝的问题正在进入日志,因此所有请求都将发往后端 http 端点。

为了解决这个问题,我遵循了以下方法,但不幸的是到现在还没有成功:

  1. 使用 更改了主机和容器两侧卷的所有权www-data。主机和容器都拥有此www-data用户,并且具有相同的信息,例如用户名、uid、shell 等。

  2. chmod777主机和容器端。

  3. 甚至在Dockerfile中遵循了下面的内容:

    RUN useradd foo
    RUN mkdir /data && touch /data/x
    RUN chown -R foo:foo /data
    VOLUME /data
    

需要专家的帮助来解决这个问题。

答案1

您可能更幸运地将卷安装到主机上的目录(例如将其安装在 /var/lib/docker 安装架之外)。这样做的方便之处在于,您可以使用 setfacl 递归地将目录的默认权限设置为 www-data 的 rw,只需在为 www-data 用户创建容器时明确设置 uid,并使用它来设置主机的权限,因为命名用户很可能不存在于主机上。

您可能还想研究的另一件事是根本不要以 root 身份在容器中运行任何东西。即使您的 Apache 实例绑定到 <1024 的端口,您也可以使用类似下面的方法允许低端口绑定而无需任何 root 权限:

setcap cap_net_bind_service=+ep <your Apache binary>

但是,您绑定的端口在容器内部并不重要,因为您可以在运行时将端口 8080 映射到不同的主机端口。

如果您确保在 docker 文件末尾添加 USER 指令,则不应出现任何具有混合权限的情况。

答案2

尝试运行

chcon -R -t httpd_sys_rw_content_t /path/to/your/site

或使用参考目录:

chcon -R --reference=/var/www/html /www/sites

更多信息:

参考链接

相关内容