在Docker中访问主机目录时报Permission denied

無名 发表于: 2021-09-03   最后更新时间: 2021-09-13 09:50:51   962 游览

摘要

我试图在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。

出什么问题了?

发表于 2021-09-03

有关完整的故事,请参阅这篇关于 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
你的答案

查看docker相关的其他问题或提一个您自己的问题