为什么docker容器会提示“权限被拒绝”?

我使用以下命令运行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并且拥有所有权限:

[[email protected]/]#cd/tmp/install/database/
[[email protected]数据库]#ls
ls:无法打开目录。:权限被拒绝
[[email protected]数据库]#id
uid=0(根目录)gid=0(根目录)组=0(根目录)
[[email protected]数据库]#光盘。。
[[email protected]安装]#ls-alt
......
drwxr-xr-x。7根根4096根2014年7月7日数据库

我在主机中检查了/root/database,一切似乎都正常:

[[email protected]~]#ls-lt
......
drwxr-xr-x。7根根4096根2014年7月7日数据库

为什么docker容器会提示“权限被拒绝”

更新
根本原因与SELinux有关。事实上,我去年也遇到过类似的问题

容器中对共享目录的权限被拒绝可能是因为该共享目录存储在设备上。默认情况下,容器无法访问任何设备。添加选项$docker run--privileged允许容器访问所有设备并执行内核调用这不被认为是安全的。

共享设备的一种更简洁的方法是使用选项docker run--device=/dev/sdb(如果/dev/sdb是您要共享的设备)

从手册页:

--设备=[]
将主机设备添加到容器(例如--device=/dev/sdc:/dev/xvdc:rwm)
--特权=真|假
为此容器授予扩展权限。默认值为false。
默认情况下,Docker容器是“非特权的”(=false),例如,不能在Docker容器内运行Docker守护程序。这是因为默认情况下不允许容器访问任何设备。“特权”容器可以访问所有设备。
当操作员执行docker run--privileged时,docker将启用对主机上所有设备的访问,并在AppArmor中设置一些配置,以允许容器对主机的访问与主机上容器外部运行的进程几乎相同。

发表评论