136

该命令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 脚本,它运行这个 python 脚本,它又运行 docker 命令。

4

13 回答 13

161

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

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

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

文件共享首选项面板

/var在 macOS 中是指向/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关于文件系统命名空间的文档解释说:

默认情况下,您可以在/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。如果它们都没有您请求的路径,则安装失败。

在您的情况下,/varmacOS 不会导出。/varLinux VM 中存在,但/var/folders不存在。因此,路径不可用,挂载失败。

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

为了使事情更便携,您可能需要测试您当前运行的平台,如果是 macOS,请在挂载路径前加上/private.

于 2017-07-15T21:56:38.953 回答
28

使用 Docker for mac 的新版本 3.0.0,您需要在 Preferences>Experimental Features 中禁用使用 gRPC FUSE 进行文件共享。

于 2020-12-11T08:25:11.547 回答
13

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

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

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

现在我可以/var/tmp在 Docker->preference->resources->filesharing 中看到该目录。然后我重新启动了码头工人。

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

于 2020-07-10T20:52:49.033 回答
11

作为替代解决方案:

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

在 *nix 领域以及 Docker 中,.表示当前目录。由于 macOS 对沙盒越来越挑剔,这似乎是 macOS 的可行解决方案。只需instance1在同一目录中创建所需的文件夹即可。

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

于 2020-03-15T11:22:47.323 回答
7

先决条件:需要安装 'docker desktop',按照图片中提到的步骤操作: 在此处输入图像描述

于 2021-07-23T08:05:11.883 回答
6

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

于 2020-12-10T22:14:26.660 回答
2

As an example, using Portainer, this command works for me:

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

But, if I vary the -v /var:/data at all, it won't work. I think (but not sure) that its because Docker is trying to do a mkdir. So, if I try to mount -v /var/whatever:/data, mkdir fails because not enough permission, and it doesn't work.

I have 2 Mac's (High Sierra) and I tried it on both. Same problem. Also, I tried using Docker Beta channel. I think I understand Dan Lowe's answer: I'll update this answer if that works for me.

UPDATE:

Now this works. NOTE: I configured docker to allow permission to /var/tmp

docker run -d --restart unless-stopped -p 9000:9000 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /var/tmp/data:/data portainer/portainer --no-auth
于 2018-04-14T02:42:26.983 回答
2

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

在此处输入图像描述

于 2021-01-06T19:15:25.623 回答
0

如果您在 MAC 上仍然遇到此问题,请尝试添加:$PWD

在本地文件目录路径之前添加 $PWD,如下所示:docker run -v $PWD/folders/:/path/to/directory。

于 2021-10-08T21:18:06.750 回答
0

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

于 2021-07-22T10:01:14.387 回答
0

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

于 2020-08-28T15:28:13.157 回答
0

如果您在 mac 上看不到文件夹,请打开终端并键入:

默认写入 com.apple.Finder AppleShowAllFiles YES

然后通过按住 alt 并右键单击(两指)finder 并选择重新启动然后单击菜单栏中文件旁边的“finder”,单击首选项在硬盘中添加检查,然后在桌面上显示这些项目侧边栏也检查那里的硬盘然后转到隐藏文件夹并将其拖到您的收藏夹中,它将显示在 docker> 首选项 > 资源 > 文件共享 > + 窗口中

于 2022-01-30T18:26:08.630 回答
-1

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

于 2020-09-25T18:40:47.677 回答