【问题标题】:Running docker on Ubuntu: mounted host volume is not writable from container在 Ubuntu 上运行 docker:挂载的主机卷不可从容器写入
【发布时间】:2015-12-01 22:25:05
【问题描述】:

Docker 对我来说在 Mac 上运行良好,但我必须在 VirtualBox(或 Parallels 或 VMWare Fusion)内运行 docker host,因为 Mac 的内核不支持 docker。

所以我尝试在 Ubuntu 桌面上设置我的应用程序和 docker-compose - 本地,docker 客户端和 docker 主机在同一系统上物理运行。这行得通,但我正在运行的 docker 容器无法写入已安装的主机卷。

我使用带有以下设置的 docker-compose:

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

所以我将主机 Ubuntu 操作系统的“api”目录挂载到 /usr/src/app 下的 docker 容器中。

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

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

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

当然,我在 Google 上搜索过这个问题,并且遇到了 CentOS/RHEL 的一些 SELinux 问题,但我运行的是 Ubuntu 15.10,64 位版本,而不是 CentOS。

【问题讨论】:

    标签: linux ubuntu docker docker-compose


    【解决方案1】:

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

    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

    【讨论】:

    • “核选项”和 uid 修复都有效。对于 uid 修复,我只是在 Dockerfile 中添加了“usermod -u 1000 docker”。
    • 在我的情况下,将卷目录上的所有者设置为用户帮助(UID 已经相同)。
    • 但对我来说,在将容器 uid:gid 所有权授予主机 dir 后它不起作用。但如果我挂载 docker 卷它可以工作。在-v empty/dir:/opt/nifi-registry/nifi-registry-0.4.0 的情况下失败,但工作正常-v volume_data:/opt/nifi-registry/nifi-registry-0.4.
    • 选项 1 怎么做?
    【解决方案2】:

    新答案:

    这个问题似乎有很多流量,现在有更好的解决方案 - fixuid,顾名思义,它是一个神奇的可执行文件,可以在容器启动时更改容器用户的 uid 和 gid(使用 -u someone: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 compose 中使用它:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多