在Ubuntu上运行docker:挂载的主机卷不能从容器写入

Docker在我的Mac上工作得很好,但是我必须在VirtualBox(或者Parallels或者VMWare Fusion)里面运行docker主机,因为Mac的内核不支持docker。

所以我试图设置我的应用程序和docker-compose在Ubuntu桌面 – 本地,docker客户端和docker主机都在同一个系统上物理运行。 这工作,但我的运行docker集装箱不能写入已安装的主机卷。

我使用docker-compose进行以下设置:

volumes: - ./api:/usr/src/app 

因此,我将主机Ubuntu OS的“api”目录挂载到/ usr / src / app下的docker容器中。

docker inspect <container ID>显示该卷是可写的

 "Destination": "/usr/src/app", "Mode": "rw", "RW": true 

然而,这不是:当我尝试创build一个目录或从docker容器内编辑一个文件时,我得到permission denied

当然,我search了这个问题,并且遇到了几个CentOS / RHEL的SELinux问题,但是我运行Ubuntu 15.10,64位版本 ,而不是CentOS。

Solutions Collecting From Web of "在Ubuntu上运行docker:挂载的主机卷不能从容器写入"

如果您的主机( id -u )上的uid与docker容器中的用户的uid不同(通常是“docker”),那么您可以遇到这个问题。 你可以试试:

  1. 在用户和Docker容器中的用户之间使UID相同。
  2. 将目录上的组权限设置为您和docker所属的组的可写权限。
  3. 你也可以使用核选项:

chmod a+rwx -R project-dir/

核选项会让你的git工作区变得肮脏,这会让你大吃一惊,所以不是最好的长期解决方案。 它止住了流血的寿命。

为了进一步了解这个问题,你可能会发现这些有用的:

  1. https://github.com/docker/docker/issues/7906
  2. https://github.com/docker/docker/issues/7198

从Docker版本1.7开始,您可以选择使用如下所示的:Z或:z标志来挂载具有对容器的权限的主机目录:

 docker run -v ./api:/usr/src/app:Z 
  • :z – 将使用标签'svirt_sandbox_file_t'向所有容器添加权限
  • :Z – 只会将权限添加到当前容器标签

从docker-compose v1.4.0开始,你可以在Docker中使用它:

 volumes: - ./api:/usr/src/app:Z 

虽然我应该添加我仍然有一些问题(请参阅使用docker-compose添加对主机目录的权限 )。

参考文献:

在Docker中使用卷可能会导致SELinux出现问题 – http://www.projectatomic.io/blog/2015/06/using-volumes-with-docker-can-cause-problems-with-selinux/

Docker用户指南 – https://docs.docker.com/engine/userguide/dockervolumes/#volume-labels

Docker-compose发行说明v1.4.0 – https://github.com/docker/compose/releases/tag/1.4.0