坐骑拒绝。路径... 不共享从 OS X 和不知道的多克

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

151390 次浏览

Docker for Mac 卷挂载的行为与基本 Docker 系统不同。这主要是因为 Docker 试图遵守苹果的文件系统沙盒指导方针。

如 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 的 关于文件系统命名空间的文档解释道:

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

-v绑定挂载中使用的所有其他路径都来源于运行 Docker 容器的 Moby Linux VM, 所以像 -v /var/run/docker.sock:/var/run/docker.sock这样的参数应该可以正常工作。如果一个 macOS 路径不共享,并且在 VM 中不存在,那么尝试绑定 mount 将会失败,而不是在 VM 中创建它。已经存在于 VM 中并包含文件的路径由 Docker 保留,不能从 macOS 导出。

注意,这里特别提到的 /var/run是一个从 Linux VM 而不是 macOS 挂载的位置。

请求卷装入时,首先检查 macOS 文件系统导出。如果没有匹配,那么下一步将检查 Docker 所在的 Linux VM。如果它们都没有您请求的路径,则挂载失败。

在您的示例中,macOS 不导出 /var/var存在于 Linux VM 中,而 /var/folders不存在。因此,路径不可用,挂载失败。

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

为了提高可移植性,您可能需要测试当前运行在哪个平台上,如果是 macOS,则在挂载路径前加上 /private

作为一个例子,使用 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 会失败,因为没有足够的权限,它不能工作。

我有两个 Mac’s (High Sierra) ,我两个都试过了。同样的问题。还有,我试过用 Docker Beta 频道。我想我明白丹 · 洛的回答了: 如果这对我有用,我会更新这个回答。

更新:

注意: 我将 docker 配置为允许对/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

作为 另一种选择的解决方案:

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

在 * nix 区域,因此也就是 Docker 区域,abc0表示工作目录。由于 macOS 对沙箱越来越挑剔,这似乎是一个可行的解决方案。只需在同一目录中创建 instance1所需的文件夹。

这种解决方案的另一个优点是,它消除了使用 sudo运行 docker-compose的需要。不管怎样,在这种情况下,它不会造成伤害,但仍然,这是一个加分。

我有一个类似的问题,我创建了一个目录 /var/tmp在我的 Mac,我想挂载在我的码头容器。

通过将目录路径添加到一个文件解决了这个问题,如下所示:

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

现在,我可以在 Docker-> 偏好-> 资源-> 文件共享中看到目录 /var/tmp

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

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

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

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

对于新版本的3.0.0版本的 Docker for mac,您需要在参数设置 > 实验特性中禁用使用 gRPC FUSE 进行文件共享。

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

enter image description here

必须同时添加/private/var/tmp 和/var/tmp 来解决问题

预先要求: 需要安装‘ docker 桌面’, 按照图中提到的步骤: enter image description here

如果你仍然有这个问题的 MAC 尝试添加: $PWD

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

如果你在 Mac 上看不到文件夹,打开终端,然后输入:

默认写 com.apple 查找 AppleShowAllFiles YES

然后重新启动查找器,按住查找器上的 alt 和右键(两个手指) ,选择重新启动,然后点击菜单栏中文件旁边的“查找器”,点击首选项在硬盘中添加一个检查,在桌面上显示这些项目,然后边栏检查那里的硬盘,然后进入隐藏文件夹,并将其拖动到您的收藏夹,它将显示在多克 > 首选项 > 资源 > 文件共享 > + 窗口

在我看来: 添加文件夹后,重新启动 都很强大终端和 docker 解决了我这边的问题

我将文件夹 /builds添加到 ~/Library/Group\ Containers/group.com.docker/settings.json中的 filesharingDirectories,比如:

"filesharingDirectories": [
"/builds",
"/host_mnt",
"/tmp",
"/Users",
"/Volumes",
"/private",
"/var/folders"
],

(我还添加了 host_mnt)

然后,我使用文件 /etc/synthetic.conf将这两个文件夹添加到 /:

mkdir -p /Users/me/gitlab-misc/builds
mkdir -p /Users/me/gitlab-misc/host_mnt
sudo vim /etc/synthetic.conf

/etc/synthetic.conf中我有:

builds  /Users/me/gitlab-misc/builds
host_mnt    /Users/me/gitlab-misc/host_mnt

(使用 TAB,而不是空格)

sudo chmod 0644 /etc/synthetic.conf
sudo chown root:wheel /etc/synthetic.conf

然后重启机器

我想要补充的是,我已经将路径添加到 Docker,但我粗略地指出绑定挂载是绝对的,而不是相对的,并且我将它指向一个不存在的文件。我得到了与 OP 相同的错误。

如果有 。 env文件,请仔细检查 BASE _ PATH 常量,因为它可能包含不正确的路径。

# System Configuration
BASE_PATH=/Users/<your_OS_user>/Projects

对我来说就是这样。