我使用以下命令运行 docker 容器,并将目录从主机( /root/database
)映射到容器( /tmp/install/database
):
# docker run -it --name oracle_install -v /root/database:/tmp/install/database bofm/oracle12c:preinstall bash
但是在容器中,我发现我无法使用 ls
列出 /tmp/install/database/
中的内容,尽管我是 root
并且拥有所有权限:
[root@77eb235aceac /]# cd /tmp/install/database/
[root@77eb235aceac database]# ls
ls: cannot open directory .: Permission denied
[root@77eb235aceac database]# id
uid=0(root) gid=0(root) groups=0(root)
[root@77eb235aceac database]# cd ..
[root@77eb235aceac install]# ls -alt
......
drwxr-xr-x. 7 root root 4096 Jul 7 2014 database
我在主机中检查 /root/database
,一切似乎都正常:
[root@localhost ~]# ls -lt
......
drwxr-xr-x. 7 root root 4096 Jul 7 2014 database
为什么docker容器提示“Permission denied”?
更新:
根本原因与 SELinux
有关。实际上,我去年遇到了类似的 问题。
原文由 Nan Xiao 发布,翻译遵循 CC BY-SA 4.0 许可协议
在容器内拒绝共享目录的权限可能是因为该共享目录存储在设备上。默认情况下,容器不能访问任何设备。添加选项
$docker run --privileged
允许容器访问 所有 设备并执行内核调用。 这不被认为是安全的。共享设备的一种更简洁的方法是使用选项
docker run --device=/dev/sdb
(如果/dev/sdb
是您要共享的设备)。从手册页: