在Docker中访问主机目录时被拒绝了权限
在Docker中访问主机目录时被拒绝了权限
我正在尝试在 Docker 中挂载主机目录,但无法从容器内部访问,即使访问权限看起来良好。
我正在执行
sudo docker run -i -v /data1/Downloads:/Downloads ubuntu bash
然后
ls -al
它给我:
total 8892 drwxr-xr-x. 23 root root 4096 Jun 18 14:34 . drwxr-xr-x. 23 root root 4096 Jun 18 14:34 .. -rwxr-xr-x. 1 root root 0 Jun 18 14:34 .dockerenv -rwx------. 1 root root 9014486 Jun 17 22:09 .dockerinit drwxrwxr-x. 18 1000 1000 12288 Jun 16 11:40 Downloads drwxr-xr-x. 2 root root 4096 Jan 29 18:10 bin drwxr-xr-x. 2 root root 4096 Apr 19 2012 boot drwxr-xr-x. 4 root root 340 Jun 18 14:34 dev drwxr-xr-x. 56 root root 4096 Jun 18 14:34 etc drwxr-xr-x. 2 root root 4096 Apr 19 2012 home
和更多类似的行(我认为这是相关的部分)。
如果我执行
cd /Downloads ls
结果是
ls: cannot open directory .: Permission denied
主机是 Fedora 20,具有 Docker 1.0.0 和 go1.2.2。
怎么了?
admin 更改状态以发布 2023年5月22日
这是一个SELinux问题。
你可以在主机上暂时输入
su -c "setenforce 0"
来访问,或者通过运行以下命令添加一个SELinux规则:
chcon -Rt svirt_sandbox_file_t /path/to/volume
完整的情况请参考这篇关于卷和SELinux的Project Atomic博客文章。
具体来说:
最近这变得更容易了,因为Docker终于合并了一个补丁,
新版docker-1.7中将会看到该补丁
(我们在RHEL,CentOS和Fedora的docker-1.6中使用该补丁)。此补丁在挂载卷(-v)时添加了支持“z”和“Z”作为选项。
例如:
docker run -v /var/db:/var/db:z rhel7 /bin/sh
将自动执行man页面中描述的
chcon -Rt svirt_sandbox_file_t /var/db
。更好的是,您可以使用Z。
docker run -v /var/db:/var/db:Z rhel7 /bin/sh
这将使用容器将运行的确切MCS标签标记容器内部的内容,基本上会运行
chcon -Rt svirt_sandbox_file_t -l s0:c1,c2 /var/db
,其中s0:c1,c2
对于每个容器都不相同。