拒绝对卷的Docker权限

aurhwmvo  于 2023-01-25  发布在  Docker
关注(0)|答案(3)|浏览(204)

我正在尝试启动一个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

hgtggwj0

hgtggwj01#

问题是由SELinux导致的,SELinux阻止Docker访问文件系统。
如果有人有同样的问题比这篇文章,这里是如何检查它是否是相同的情况:
1/检查SELinux状态:sestatus。如果模式是 * 强制执行 *,则可能会阻止Docker访问文件系统。

# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      31

2/将模式更改为 * 许可 *:setenforce 0。Docker上不应该有更多的限制。

sczxawaw

sczxawaw2#

您正在从主机上的/opt/content复制到容器中的/usr/share/nginx/html,因此当您登录时,您希望在/usr/share/nginx/html中查找文件。
如果这还不够,你可以粘贴ls -lah /usr/share/nginx/html的内容,但我认为你只是没有一个索引页在那里。

aor9mmx1

aor9mmx13#

我建议为卷源设置正确的安全上下文,而不是在您的主机上将SELinux完全设置为permissive:

chcon -R -t container_file_t PATHTOHOSTDIR

相关问题