【问题标题】:In Docker for Windows, permissions denied for mkdir/chown在 Docker for Windows 中,mkdir/chown 的权限被拒绝
【发布时间】:2017-10-08 09:51:44
【问题描述】:

我正在开发一个 ghost 博客并将其部署为 docker 容器。由于我的项目的目标之一是使用实时数据开发主题和其他内容,因此我按照 ghost docker 映像的建议为 /var/lib/ghost 目录创建了一个卷挂载。

ghost docker 映像可以正常安装驱动器,但是当它尝试 chown 文件时,会收到权限被拒绝错误。我正在运行 Windows 10 的 Creator 更新和最新的 Docker for Windows(即 Windows 10 Pro versin 1703 和 Docker 版本 17.03.1-ce-win5)

作为测试,我在家里和工作中都遵循了这个程序(我在以前版本的 Windows 10 上):

  1. 在 C:\users\joe\ 中创建一个 Project\site 目录
  2. 将docker-compose.yml文件放在目录下:
  3. 运行docker-compose up

docker-compose.yml

version: '3'
services:
  blog:
    image: ghost
    volumes:
      - ./blog:/var/lib/ghost
    ports:
      - "2368:2368"

在我的工作机器上,它会创建博客目录,并按照幽灵博客的预期填充主题和内容。

在我的家用机器上,我收到此错误:

错误:对于博客无法启动服务博客:创建挂载源路径“/C/Users/joe/Projects/site/blog”时出错:mkdir /C/Users/joe/Projects/site/blog:权限被拒绝 错误:启动项目时遇到错误。

如果我自己创建目录,然后再次运行docker-compose.yml,我会收到此错误:

blog_1 | chown:更改“/var/lib/ghost”的所有权:权限被拒绝

site_blog_1 以代码 1 退出

挂载目录确实有效,我已经运行了 alpine ls /data 示例,显示在 Docker for Windows 中的共享驱动器设置中。

我比较了 docker 中的设置、虚拟网络上的设置、家庭目录和工作目录的设置——我能找到的唯一区别是因为工作在域上,并且有不同的用户名,而且我的版本窗口数为 1607。

我不知道这是一个错误,是当前 windows && docker 之间的不良交互,还是我在本地做错了什么。我承认我倾向于后者,因为我在任何地方都找不到关于此的文档。

【问题讨论】:

  • 您在该驱动器上启用了共享并在 docker/settings 中提供了凭据,我猜?
  • 是的。我可以这样做: docker run --rm -v c:/Users:/data alpine ls /data 没有问题
  • 我建议在这里创建一个问题:github.com/docker/for-win

标签: windows docker permissions


【解决方案1】:

这个问题(我不知何故错过了)Error mounting a config file into the container

回答问题。

我取消共享 C,重新共享它,但问题仍然存在。 我点击了“重置凭据”,然后重新共享(输入我的密码),它成功了。

【讨论】:

  • 您在哪里点击了重置凭据?
【解决方案2】:

我在 Windows 10 上为这个问题苦苦挣扎了一段时间。解决方案是我在互联网上找到的建议的组合 - 假设您要共享的目录位于您的用户目录下方:

  1. 在 Windows 中创建一个新用户 - 例如DockerHost(不需要电子邮件地址,只需用户名和密码)
  2. 授予对用户目录下第一个文件夹的读取权限,例如C:\Users\YourName\Development(在文件管理器中右键目录,选择安全选项卡,确保已在其中添加了 DockerHost 用户并至少授予读取权限。
  3. 对所有文件夹执行相同操作,直到您要共享的文件夹
  4. 在 Docker 桌面设置中,转到共享驱动器,选择您的(可能)C 驱动器,重置凭据,然后再次共享(选中复选框并单击“应用”),当提示输入用户名和密码时,输入您创建的用户名,例如DockerHost,以及密码。
  5. 现在当运行docker container run -p 80:80 -v C:\Users\YourName\Development\docker_examples:/usr/share/nginx/html --rm nginx 之类的东西时,它应该可以工作了

【讨论】:

    【解决方案3】:

    如果您在 docker 中收到错误提示:

    mkdir: can't create directory 'l': Permission denied
    

    当您尝试在 Windows 上的共享文件夹中创建文件夹或文件时,这是为您准备的。

    确保您拥有共享文件夹的完全控制权限,以实现此目的:

    要检查您是否拥有完全控制权限,请从 Windows 文件管理器转到网络,选择驱动器并尝试从所选文件夹中创建文件。

    如果您收到错误消息说您没有权限,则表示您有读取权限但没有写入权限。

    在这种情况下,从网络路径中的文件夹中,右键单击并选择属性->选择“共享”选项卡->单击“高级共享”。

    在“高级共享”窗口中,单击“权限”。

    从“权限”窗口中,选择“完全控制”。

    完成后,您可以返回 Docker 并尝试创建文件。

    docker run -it -v "$(pwd):/myapp" node:16 sh
    cd myapp
    touch b.txt
    

    【讨论】:

      【解决方案4】:

      在 Win 10 上,我必须将整个驱动器的所有者更改为我自己的用户,而不是在 docker 重新共享驱动器使用重置凭据。见下图:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-23
        • 1970-01-01
        • 2016-08-24
        • 2013-07-01
        • 2012-08-13
        • 1970-01-01
        相关资源
        最近更新 更多