我正在尝试启动一个Nginx容器,该容器提供位于主机上/opt/content中的静态内容。
容器以下列内容开始:
docker run -p 8080:80 -v /opt/content:/usr/share/nginx/html nginx:alpine
而且Nginx一直给我403 Forbidden。而且,当我试图检查目录的内容时,我得到了奇怪的结果:
$ $ docker exec -i -t inspiring_wing /bin/sh
/ # ls -l /usr/share/nginx/
total 4
drwxrwxrwx 3 root root 4096 Aug 15 08:08 html
/ # ls -l /usr/share/nginx/html/
ls: can't open '/usr/share/nginx/html/': Permission denied
total 0
我尝试chmod -R 777 /opt/
以确保主机上没有限制,但它不会改变任何东西。我还尝试将:ro
标记添加到卷选项中,但没有成功。
如何使容器能够读取已装入的卷?
更新:以下是我重现这个问题的完整步骤(作为root用户,使用另一个目录从干净的配置开始):
mkdir /public
echo "Hello World" > /public/index.html
chmod -R 777 /public
docker run -p 8080:80 -d -v /public:/usr/share/nginx/html nginx:alpine
docker exec -i -t inspiring_wing /bin/sh
ls -l /usr/share/nginx/html
容器中的最后一条命令返回给我:ls -l /usr/share/nginx/html
。当然,用创建的容器的名称替换inspiring_wing
。
3条答案
按热度按时间hgtggwj01#
问题是由SELinux导致的,SELinux阻止Docker访问文件系统。
如果有人有同样的问题比这篇文章,这里是如何检查它是否是相同的情况:
1/检查SELinux状态:
sestatus
。如果模式是 * 强制执行 *,则可能会阻止Docker访问文件系统。2/将模式更改为 * 许可 *:
setenforce 0
。Docker上不应该有更多的限制。sczxawaw2#
您正在从主机上的/opt/content复制到容器中的/usr/share/nginx/html,因此当您登录时,您希望在/usr/share/nginx/html中查找文件。
如果这还不够,你可以粘贴
ls -lah /usr/share/nginx/html
的内容,但我认为你只是没有一个索引页在那里。aor9mmx13#
我建议为卷源设置正确的安全上下文,而不是在您的主机上将SELinux完全设置为permissive: