卷的Docker权限被拒绝

卷的Docker权限被拒绝,docker,docker-volume,Docker,Docker Volume,我正在尝试启动一个Nginx容器,该容器提供位于主机上的静态内容,位于/opt/content中 容器从以下内容开始: docker run -p 8080:80 -v /opt/content:/usr/share/nginx/html nginx:alpine Nginx一直给我403。此外,在尝试检查目录内容时,我得到了奇怪的结果: $ $ docker exec -i -t inspiring_wing /bin/sh / # ls -l /usr/share/nginx/ total

我正在尝试启动一个Nginx容器,该容器提供位于主机上的静态内容,位于/opt/content中

容器从以下内容开始:

docker run -p 8080:80 -v /opt/content:/usr/share/nginx/html nginx:alpine
Nginx一直给我403。此外,在尝试检查目录内容时,我得到了奇怪的结果:

$ $ 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
I chmod-R 777/opt/以确保主机上没有任何限制,但它不会改变任何东西。我还尝试在volume选项中添加: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。当然,用所创建容器的名称替换wing。

您正在从主机上的/opt/content复制到容器中的/usr/share/nginx/html。因此,当您登录时,您需要在/usr/share/nginx/html中查找文件


如果这还不够,您可以将ls-lah/usr/share/nginx/html的内容粘贴到容器中的/usr/share/nginx/html,但我认为您没有索引页。

您正在从主机上的/opt/content复制到容器中的/usr/share/nginx/html。因此,当您登录时,您需要在/usr/share/nginx/html中查找文件


如果这还不够,您可以粘贴ls-lah/usr/share/nginx/html的内容,但我认为您没有索引页。

问题是由于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/将模式更改为许可:设置强制0。Docker应该没有更多的限制。

问题是由于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/将模式更改为许可:设置强制0。对Docker应该没有更多的限制。

你是对的,我确实做了一些错误的复制/粘贴。。。我再次尝试使用/opt作为挂载点,而不是/usr/share/nginx,以消除此目录上的权限问题,并复制错误的终端。。。我用好的列表更新了这个问题,您可以看到/usr/share/nginx/html是不可访问的,尽管权限是777。@Florent这很有趣。我尝试了你正在做的事情,它对我来说确实正常工作。你确定你的情况不是更复杂吗?为了简化问题,你可能忽略了一些关键的细节?事实上,我也感到惊讶的是,如此普通的东西不起作用。我已经用我从一个干净的配置中遵循的步骤更新了这个问题,但仍然遇到了问题。。。我是不是遗漏了什么?我发现了问题所在。SELinux在我的机器Fedora上运行,禁用它可以解决问题。非常感谢您抽出时间让我知道它应该可以正常工作。您是对的,我确实做了一些错误的复制/粘贴。。。我再次尝试使用/opt作为挂载点,而不是/usr/share/nginx,以消除此目录上的权限问题,并复制错误的终端。。。我用好的列表更新了这个问题,您可以看到/usr/share/nginx/html是不可访问的,尽管权限是777。@Florent这很有趣。我尝试了你正在做的事情,它对我来说确实正常工作。你确定你的情况不是更复杂吗?为了简化问题,你可能忽略了一些关键的细节?事实上,我也感到惊讶的是,如此普通的东西不起作用。我已经用我从一个干净的配置中遵循的步骤更新了这个问题,但仍然遇到了问题。。。我是不是遗漏了什么?我发现了问题所在。SELinux在我的机器Fedora上运行,禁用它可以解决问题。非常感谢您抽出时间,让我知道它应该按原样工作。