提问者:小点点

拒绝访问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

主机是Fedora20,带有Docker1.0.0和Go1.2.2。

哪里出问题了?


共3个答案

匿名用户

有关卷和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

将自动执行手册页中描述的chcon-rt svirt_sandbox_file_t/var/db

更好的是,你可以使用Z。

docker run -v /var/db:/var/db:Z rhel7 /bin/sh

这将使用容器运行时使用的精确MCS标签来标记容器内的内容,基本上它运行chcon-rtsvirt_sandbox_file_t-l s0:c1,c2/var/db,其中s0:c1,c2对于每个容器都是不同的。

匿名用户

这是一个SELinux问题。

您可以暂时发出

su -c "setenforce 0"

以访问或添加SELinux规则,方法是运行

chcon -Rt svirt_sandbox_file_t /path/to/volume

匿名用户

警告:此解决方案存在安全风险。

尝试以特权身份运行容器:

sudo docker run --privileged=true -i -v /data1/Downloads:/Downloads ubuntu bash

另一种选择(我没有尝试过)是创建一个特权容器,然后在其中创建非特权容器。