Docker 权限被拒绝
Docker permission denied with volume
我正在尝试启动一个 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
容器内的最后一个命令 returns 我:ls -l /usr/share/nginx/html
。当然,把inspiring_wing
替换成创建容器的名字。
您正在从主机上的 /opt/content 复制到容器中的 /usr/share/nginx/html。因此,当您登录时,您想在 /usr/share/nginx/html 中查找文件。
如果这还不够,您可以粘贴 ls -lah /usr/share/nginx/html
的内容,但我认为您那里没有索引页。
问题是由阻止 Docker 访问文件系统的 SELinux 引起的。
如果有人遇到与此相同的问题 post,请按以下方法检查情况是否相同:
1/ 检查 SELinux 状态:sestatus
。如果模式是 enforcing,它可能会阻止 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.
应该没有更多的限制了
我正在尝试启动一个 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
容器内的最后一个命令 returns 我:ls -l /usr/share/nginx/html
。当然,把inspiring_wing
替换成创建容器的名字。
您正在从主机上的 /opt/content 复制到容器中的 /usr/share/nginx/html。因此,当您登录时,您想在 /usr/share/nginx/html 中查找文件。
如果这还不够,您可以粘贴 ls -lah /usr/share/nginx/html
的内容,但我认为您那里没有索引页。
问题是由阻止 Docker 访问文件系统的 SELinux 引起的。
如果有人遇到与此相同的问题 post,请按以下方法检查情况是否相同:
1/ 检查 SELinux 状态:sestatus
。如果模式是 enforcing,它可能会阻止 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.