【发布时间】:2019-02-06 16:30:35
【问题描述】:
我有一个运行 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 入口点进入容器时,我可以使用 /sbin/httpd -D FOREGROUND 以 root 身份启动 apache,一切都按预期工作。
所以我认为它几乎可以肯定是权限问题。谷歌搜索发现很多页面都有我的错误,例如 Apache restart causes DocumentRoot must be a directory, even though it is a directory and there seem to be no privilege issues 这个特定页面详细描述了我得到的内容,几乎每个页面中的解决方案都是配置 SELinux。但是 SELinux 被禁用。即使在该链接中,也有来自 OP 的评论
我的 linux 版本不是 Security Enhanced Linux,所以在不理解的情况下我还是尝试了它:没有效果。
然而他们接受了配置 SELinux 的解决方案。
我想我遗漏了一些东西,几乎可以肯定与 SELinux 相关,但我想不通。 docker 映像具有以下(明显缺乏)SELinux 设置:
- /etc/selinux 仅包含 semanage.conf 和 tmp/(空)
- /usr/sbin 不包含 se* 可执行文件
-
rpm -qa | grep selinuxlibselinux-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 镜像?如果是自定义镜像,你能分享你的 Dockerfile 吗?是否还可以包含用于启动映像的
docker run命令? -
谢谢!你把我推向了正确的方向。我使用 docker-compose 来启动一些相关的服务。我正在将这些服务从我们的 ubuntu 基地转移到客户的 centos 基地,但我没有更新 docker-compose.yml 中的卷映射。将它们从 deb 路径更改为 centos 路径已经解决了这个问题。
标签: apache docker centos selinux