为什么我的Docker容器无法写入挂载的主机目录?

我使用以下命令运行Docker容器:

sudo docker run --name=bamboo-server -p 8085:8085 -p 54663:54663 -v /data/bamboo-server:/home/bamboo hwuethrich/bamboo-server 

我希望容器中的/home/bamboo映射到/data/bamboo-server 。 但是,我的容器无法写入映射的目录。 这从主机工作正常:

 [walt@walt bamboo]$ touch /data/test.txt 

但不是从容器:

 [walt@walt bamboo]$ sudo docker exec bamboo-server touch /home/bamboo/test.txt touch: cannot touch '/home/bamboo/test.txt': Permission denied 

/data目录的权限都是chmodded到777:

 [walt@walt bamboo]$ ls -la /data/ total 0 drwxrwxrwx. 3 root root 43 May 6 02:29 . dr-xr-xr-x. 18 root root 248 Apr 30 14:16 .. drwxrwxrwx. 2 root root 6 May 6 01:50 bamboo-server -rw-rw-r--. 1 walt walt 0 May 6 02:29 test.txt [walt@walt bamboo]$ ls -la /data/bamboo-server/ total 0 drwxrwxrwx. 2 root root 6 May 6 01:50 . drwxrwxrwx. 3 root root 43 May 6 02:29 .. 

其他debugging信息:

 [walt@walt bamboo]$ sudo docker exec bamboo-server whoami root [walt@walt bamboo]$ sudo docker -v Docker version 1.9.1, build ee06d03/1.9.1 [walt@walt bamboo]$ df -h /data Filesystem Size Used Avail Use% Mounted on /dev/sda1 1.9T 33M 1.9T 1% /data 

谢谢!

您在安装了SELinux的系统上使用Docker。

在SELinux下,要从主机共享到容器的文件必须被赋予相应的SELinux上下文svirt_sandbox_file_t

所以你需要设置适当的文件上下文:

 semanage fcontext -a -t svirt_sandbox_file_t "/data(/.*)?" 

然后重置文件上下文:

 restorecon -r -v /data