apache - 运行 Apache2 的 Docker Centos 7 映像“DocumentRoot ... 不可读”
问题描述
我有一个运行 Centos 7 映像的 docker 容器。它需要做的就是运行一个简单的 Apache2 服务器。当容器启动时,它会立即退出:
AH00526: Syntax error on line 119 of /etc/httpd/conf/httpd.conf:
DocumentRoot '/var/www/html' is not a directory, or is not readable
我做了一些基本的检查:
- 文件夹存在
- 每个文件夹 /var/www/html 的权限是 ```rwx r_x r_x root root````
- 尝试过
chown -R apache /var/www
(没有稻草会保持松散!) - SELinux 被禁用(……或者是吗?)
当我使用 bash 入口点进入容器时,我可以以 root 身份启动 apache /sbin/httpd -D FOREGROUND
,一切都按预期工作。
所以我认为它几乎可以肯定是权限问题。谷歌搜索发现很多页面都有我的错误,例如 Apache 重新启动导致 DocumentRoot 必须是一个目录,即使它是一个目录并且似乎没有权限问题 这个特定页面详细描述了我得到的内容,几乎每个页面中的解决方案都是配置 SELinux . 但是 SELinux 被禁用。即使在那个链接中,也有来自 OP 的评论
我的 linux 版本不是 Security Enhanced Linux,所以在不理解的情况下我还是尝试了它:没有效果。
然而他们接受了配置 SELinux 的解决方案。
我想我遗漏了一些东西,几乎可以肯定与 SELinux 相关,但我无法弄清楚。docker 映像具有以下(明显缺乏)SELinux 设置:
- /etc/selinux 仅包含 semanage.conf 和 tmp/(空)
- /usr/sbin 不包含 se* 可执行文件
rpm -qa | grep selinux
libselinux-2.5-12.el7.x86_64
- /etc/sysconfig/selinux 不存在
- 所以在 Dockerfile 我试过
RUN echo "SELINUX=disabled" > /etc/sysconfig/selinux
- 所以在 Dockerfile 我试过
yum install -y policycoreutils
在 /usr/sbin 中安装 sestatus 。运行 sestatus 给出SELinux status: disabled
- 有或没有 /etc/sysconfig/selinux
看起来 SELinux 确实被禁用了,但错误看起来很像它已启用。
解决方案
这种情况下的问题是由于容器的启动方式造成的。
我使用 docker-compose 来启动这个特定的容器,但卷映射的路径不正确。
我仍然不确定为什么这会导致 apache 无法以它的方式启动,但更正路径解决了这个问题。
推荐阅读
- python - 带有两个协程的 asyncIO 多线程服务器
- recursion - 非尾递归触底后会发生什么
- avfoundation - 是什么导致 AVAssetCache 报告完全下载的资产无法离线播放?
- html - during accessibility testing, tools complain that my google search box is missing a title
- swift - 在 Cocoa Swift macOS 应用程序中,有没有办法将 AVPlayerView 子类化以获得圆角和阴影?
- django - django - nginx - “错误:重定向太多”
- machine-learning - 如何在训练后“记住”实际预测的分类编码?
- python - 将我的长语句转换为列表理解
- pdf - 使用 Google Cloud Storage 将 PDF 转换为 .txt 文件
- elasticsearch - 如何在弹性搜索python中添加不同的字段值并将其存储在另一个字段中(弹性搜索字段操作)