我创建了一个包含 apache 的 docker 镜像。在将该镜像运行到容器中时,apache 根进程以 身份运行root
,子进程以 身份运行www-data
。一个 docker 卷(在 Dockerfile 中定义的卷)被创建为,并/app/cache/example
在 apache 中配置为 docroot。
在容器中运行的 Apache 实际上从后端 http 端点之一呈现数据并在 apache docroot 中缓存静态资产。
但问题是 apache 无法将静态资产写入 docker 卷,权限被拒绝的问题正在进入日志,因此所有请求都将发往后端 http 端点。
为了解决这个问题,我遵循了以下方法,但不幸的是到现在还没有成功:
使用 更改了主机和容器两侧卷的所有权
www-data
。主机和容器都拥有此www-data
用户,并且具有相同的信息,例如用户名、uid、shell 等。chmod
在777
主机和容器端。甚至在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
更多信息: