运行 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") 那么你可能会遇到这个问题。你可以试试:
- 使您的用户和 docker 容器中的用户的 UID 相同。
- 将目录的组权限设置为对您和 docker 都属于的组可写。
- 你也可以使用核选项:
chmod a+rwx -R project-dir/
核选项会使您的 git
工作区变得肮脏,这会极大地困扰您,因此不是最佳的长期解决方案。它止血了。
为了进一步了解问题,您可能会发现这些有用:
新答案:
这个问题似乎有很多流量,现在有更好的解决方案 - 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
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") 那么你可能会遇到这个问题。你可以试试:
- 使您的用户和 docker 容器中的用户的 UID 相同。
- 将目录的组权限设置为对您和 docker 都属于的组可写。
- 你也可以使用核选项:
chmod a+rwx -R project-dir/
核选项会使您的 git
工作区变得肮脏,这会极大地困扰您,因此不是最佳的长期解决方案。它止血了。
为了进一步了解问题,您可能会发现这些有用:
新答案:
这个问题似乎有很多流量,现在有更好的解决方案 - 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