摘要
我试图在Docker中挂载一个主机目录,但是我不能从容器中访问它,报
ls: cannot open directory .: Permission denied
明细
我是这么运行的
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。
出什么问题了?
有关完整的故事,请参阅这篇关于 Volumes 和 SELinux 的 Project Atomic 的博客文章。
具体来说:
此补丁添加了对“z”和“Z”作为卷挂载(-v)选项的支持。
例如:
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 -Rt svirt_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
把主机的这个目录删掉,让docker自己创建,它也可能会影响。
rm -rf /data1/Downloads
你的答案