Docker:遭到拒绝。路径...不是从OS X共享的,并且Docker不知道

时间:2017-07-15 20:28:12

标签: macos docker docker-for-mac

命令docker run -v /var/folders/zz/...会产生以下错误。

docker: Error response from daemon: Mounts denied: 
The paths /var/folders/zz/... and /var/folders/zz/...
are not shared from OS X and are not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.

当我打开文件共享时,我看到/ private已经列出了。

如果我尝试添加/var/folder/,它会解析为/private/var/folders,这是/ private的子集,因此会拒绝添加。

总而言之,在我看来,目录/var/folders/..被OS X共享为/private的子目录,因此必须为Docker所知。任何有关解决此问题的帮助都将受到赞赏。

作为实验,我将文件共享中的/private替换为/private/var/folders并重新启动了docker,但结果没有改变。

只是为了更完整的引用,这是.sh script,它运行this python script,然后运行docker命令。

11 个答案:

答案 0 :(得分:72)

Docker for Mac卷安装的行为与基本Docker系统不同。这主要是因为Docker试图遵守Apple的文件系统沙箱指南。

如Docker首选项所示,macOS只导出某些路径。

  • /Users
  • /Volumes
  • /tmp
  • /private

File Sharing preference panel

macOS中的

/var/private的符号链接。对于/tmp

也是如此
$ ls -ld /tmp /var
lrwxr-xr-x@ 1 root  wheel  11 Jan 26 16:18 /tmp -> private/tmp
lrwxr-xr-x@ 1 root  wheel  11 Jan 26 16:18 /var -> private/var

为什么/tmp列在共享面板中,但/var不是({尽管两者都是/private的一部分)? Docker for Mac' documentation about filesystem namespaces解释说:

  

默认情况下,您可以直接在/Users//Volumes//private//tmp内共享文件。要添加或删除导出到Docker的目录树,请使用Docker首选项鲸鱼中的“文件共享”选项卡   菜单 - >偏好 - >文件共享。 (参见偏好。)

     

-v绑定挂载中使用的所有其他路径都来自运行Docker容器的Moby Linux VM,因此-v /var/run/docker.sock:/var/run/docker.sock之类的参数应该按预期工作。如果macOS路径未共享且在VM中不存在,则尝试绑定安装它将失败而不是在VM中创建它。 VM中已存在的路径和包含文件的路径由Docker保留,无法从macOS导出。

请注意,此处明确提到/var/run是从Linux VM安装而不是从macOS安装的地方。

当您要求卷装入时,首先检查macOS文件系统导出。如果那里没有匹配,则接下来检查运行Docker的Linux VM。如果它们都没有您请求的路径,则挂载失败。

在您的情况下,macOS不会导出/var。 Linux VM中存在/var,但/var/folders没有。因此,路径不可用,并且安装失败。

如果您将路径更改为/private/var,那么它将成功,因为macOS导出整个/private文件系统树以进行安装。

为了使事情更具可移植性,您可能需要测试当前正在运行的平台,如果是macOS,请在安装路径前加上/private

答案 1 :(得分:16)

使用适用于Mac的新版本3.0.0 Docker,您需要在“偏好设置”>“实验功能”中禁用对文件共享使用gRPC FUSE。

答案 2 :(得分:6)

作为替代解决方案:

将路径从/private/instance1-data:/home更改为./instance1-data:/home

在* nix地域(即Docker)中,.表示当前目录。由于macOS挑剔,甚至使沙盒挑剔,这似乎是macOS的可行解决方案。只需在同一目录中创建instance1所需的文件夹即可。

此解决方案的另一个优点是,它无需使用docker-compose运行sudo。无论如何,在这种情况下它不会造成任何伤害,但还是有好处的。

答案 3 :(得分:6)

卸载版本20并下载稳定的旧版本https://desktop.docker.com/mac/stable/48506/Docker.dmg

答案 4 :(得分:5)

我有一个类似的问题,我在Mac中创建了一个目录/var/tmp,我想将其挂载到Docker容器中。

通过将目录路径添加到文件中来解决该问题,如下所示:

$ cat ~/Library/Group\ Containers/group.com.docker/settings.json  
{
  "filesharingDirectories" : [
    "\/Users",
    "\/Volumes",
    "\/private",
    "\/tmp",
    "\/var\/tmp"
  ],
…

现在,我可以在Docker-> preference-> resources->文件共享中看到目录/var/tmp。然后,我重新启动了docker。

然后解决了我的安装问题。

答案 5 :(得分:2)

例如,使用Portainer,此命令适用于我:

docker run -d --restart unless-stopped -p 9000:9000 \
 -v /var/run/docker.sock:/var/run/docker.sock \
 -v /var:/data portainer/portainer --no-auth

但是,如果我完全改变-v /var:/data,它将无效。我认为(但不确定)是因为Docker正试图做一个mkdir。因此,如果我尝试挂载-v /var/whatever:/data,mkdir会失败,因为没有足够的权限,而且它不起作用。

我有2台Mac(High Sierra),我在两者上都尝试过。同样的问题。另外,我尝试使用Docker Beta频道。我想我理解Dan Lowe的回答:如果这对我有用,我会更新这个答案。

答案 6 :(得分:1)

在当前最新版本(Docker 3.0.2)中,在macos中,必须允许读取docker的目录:

enter image description here

答案 7 :(得分:1)

先决条件:需要安装“docker桌面”, 按照图片中提到的步骤: enter image description here

答案 8 :(得分:0)

当我在Docker首选项中从文件共享中删除项目路径并重新启动Docker时,我的问题已解决, 然后再次添加项目文件路径。

答案 9 :(得分:0)

您必须同时添加 /private/var/tmp 和 /var/tmp 才能解决问题

答案 10 :(得分:-1)

对于netcoreapp,请确保您已共享/ usr / local / share /