运行 docker on Ubuntu: 安装的主机卷不可从容器写入

Running docker on Ubuntu: mounted host volume is not writable from container

Docker 对我来说在 Mac 上效果很好,但我必须 运行 docker 托管在 VirtualBox(或 Parallels,或 VMWare Fusion)中,因为 Mac 的内核不支持 docker.

所以我尝试在 Ubuntu 桌面上设置我的应用程序和 docker-compose - 本地,docker 客户端和 docker 主机 运行 物理上在同一个系统上。这行得通,但是我的 运行ning 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

但事实并非如此:当我尝试在 docker 容器中创建目录或编辑文件时,我得到 permission denied

我用谷歌搜索了这个问题,当然,我遇到了一些 CentOS/RHEL 的 SELinux 问题,但是 我 运行ning Ubuntu 15.10 , 64 位版本, 不是 CentOS.

如果您在主机 (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

新答案:

这个问题似乎有很多流量,现在有更好的解决方案 - fixuid,顾名思义,它是一个神奇的可执行文件,可以在容器启动时更改容器用户的 uid 和 gid(使用 -你 somebody:somebody).

有关更详细的解释,请参阅: https://boxboat.com/2017/07/25/fixuid-change-docker-container-uid-gid/


旧答案:

从 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

虽然我应该补充一下,但我仍然有一些问题 (参见 Adding permissions to host directory with 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