我试图在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。
哪里出问题了?
有关卷和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
另一种选择(我没有尝试过)是创建一个特权容器,然后在其中创建非特权容器。