芒特否认。路径...不是从 OS X 共享的,并且 Docker 不知道
Mounts denied. The paths ... are not shared from OS X and are not known to Docker
命令 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, which runs this python script,它又运行 docker 命令。
Docker for Mac 卷安装的行为与基础 Docker 系统不同。这主要是因为 Docker 试图遵守 Apple 的文件系统沙盒指南。
如 Docker 的首选项所示,macOS 仅导出某些路径。
/Users
/Volumes
/tmp
/private
/var
在 macOS 中是符号 link 到 /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 对于 Mac 的 documentation about filesystem namespaces 解释:
By default, you can share files in /Users/
, /Volumes/
, /private/
, and /tmp
directly. To add or remove directory trees that are exported to Docker, use the File sharing tab in Docker preferences whale
menu -> Preferences -> File sharing. (See Preferences.)
All other paths used in -v
bind mounts are sourced from the Moby Linux VM running the Docker containers, so arguments such as -v /var/run/docker.sock:/var/run/docker.sock
should work as expected. If a macOS path is not shared and does not exist in the VM, an attempt to bind mount it will fail rather than create it in the VM. Paths that already exist in the VM and contain files are reserved by Docker and cannot be exported from macOS.
请注意,此处特别提到 /var/run
是从 Linux 虚拟机而不是 macOS 安装的位置。
当您请求卷装载时,首先检查 macOS 文件系统导出。如果那里没有匹配项,则接下来检查 Docker 为 运行 的 Linux VM。如果两者都没有你请求的路径,则挂载失败。
在您的情况下,/var
不是由 macOS 导出的。 /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 会失败,因为没有足够的权限,而且它不起作用。
我有 2 个 Mac (High Sierra),我都试过了。同样的问题。另外,我尝试使用 Docker Beta 频道。我想我理解 Dan Lowe 的回答:如果对我有用,我会更新这个答案。
更新:
现在可以了。注意:我配置 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,.
表示当前目录。由于 macOS 很挑剔,而且对沙盒的要求越来越高,这对于 macOS 来说似乎是一个可行的解决方案。只需在同一目录中创建 instance1
所需的文件夹即可。
这个解决方案的另一个优点是它不需要 运行 docker-compose
和 sudo
。无论如何,在这种情况下它不会造成任何伤害,但这仍然是一个加号。
我遇到了类似的问题,我在我的 Mac 中创建了一个目录 /var/tmp
,我想将其挂载到我的 docker 容器中。
通过将目录路径添加到文件中解决了问题,如下所示:
$ cat ~/Library/Group\ Containers/group.com.docker/settings.json
{
"filesharingDirectories" : [
"\/Users",
"\/Volumes",
"\/private",
"\/tmp",
"\/var\/tmp"
],
…
现在我可以在Docker->首选项->资源->文件共享中看到目录/var/tmp
。然后我重新启动了 docker.
然后解决了我的挂载问题
当我从 docker 首选项中的文件共享中删除项目路径并重新启动 docker 时,我的问题得到解决,
然后重新添加项目文件路径。
对于 netcoreapp,请确保您已共享 /usr/local/share/
卸载版本 20 并下载稳定的旧版本 https://desktop.docker.com/mac/stable/48506/Docker.dmg
对于 mac 的 Docker 新版本 3.0.0,您需要在“首选项”>“实验性功能”中禁用使用 gRPC FUSE 进行文件共享。
在当前最新版本(Docker 3.0.2)中,在 macos 中,您必须允许读取目录 docker:
您必须同时添加 /private/var/tmp 和 /var/tmp 才能解决问题
先决条件:需要安装 'docker desktop',
按照图像中提到的步骤操作:
如果您在 MAC 上仍然遇到此问题,请尝试添加:$PWD
在本地文件目录路径前添加 $PWD,如下所示:docker 运行 -v $PWD/folders/:/path/to/directory.
如果您在 mac 上看不到文件夹,请打开终端取消隐藏并键入:
默认写入 com.apple.Finder AppleShowAllFiles 是
然后通过按住 alt 并右键单击(两根手指)finder 来重新启动 finder,然后 select 重新启动然后单击菜单栏中文件旁边的“finder”,单击首选项在硬盘中添加一个检查下面的磁盘在桌面上显示这些项目然后侧边栏也检查那里的硬盘然后转到隐藏文件夹并将其拖动到您的收藏夹它会显示在 docker> 首选项 > 资源 > 文件共享 > + window
命令 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, which runs this python script,它又运行 docker 命令。
Docker for Mac 卷安装的行为与基础 Docker 系统不同。这主要是因为 Docker 试图遵守 Apple 的文件系统沙盒指南。
如 Docker 的首选项所示,macOS 仅导出某些路径。
/Users
/Volumes
/tmp
/private
/var
在 macOS 中是符号 link 到 /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 对于 Mac 的 documentation about filesystem namespaces 解释:
By default, you can share files in
/Users/
,/Volumes/
,/private/
, and/tmp
directly. To add or remove directory trees that are exported to Docker, use the File sharing tab in Docker preferences whale menu -> Preferences -> File sharing. (See Preferences.)All other paths used in
-v
bind mounts are sourced from the Moby Linux VM running the Docker containers, so arguments such as-v /var/run/docker.sock:/var/run/docker.sock
should work as expected. If a macOS path is not shared and does not exist in the VM, an attempt to bind mount it will fail rather than create it in the VM. Paths that already exist in the VM and contain files are reserved by Docker and cannot be exported from macOS.
请注意,此处特别提到 /var/run
是从 Linux 虚拟机而不是 macOS 安装的位置。
当您请求卷装载时,首先检查 macOS 文件系统导出。如果那里没有匹配项,则接下来检查 Docker 为 运行 的 Linux VM。如果两者都没有你请求的路径,则挂载失败。
在您的情况下,/var
不是由 macOS 导出的。 /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 会失败,因为没有足够的权限,而且它不起作用。
我有 2 个 Mac (High Sierra),我都试过了。同样的问题。另外,我尝试使用 Docker Beta 频道。我想我理解 Dan Lowe 的回答:如果对我有用,我会更新这个答案。
更新:
现在可以了。注意:我配置 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,.
表示当前目录。由于 macOS 很挑剔,而且对沙盒的要求越来越高,这对于 macOS 来说似乎是一个可行的解决方案。只需在同一目录中创建 instance1
所需的文件夹即可。
这个解决方案的另一个优点是它不需要 运行 docker-compose
和 sudo
。无论如何,在这种情况下它不会造成任何伤害,但这仍然是一个加号。
我遇到了类似的问题,我在我的 Mac 中创建了一个目录 /var/tmp
,我想将其挂载到我的 docker 容器中。
通过将目录路径添加到文件中解决了问题,如下所示:
$ cat ~/Library/Group\ Containers/group.com.docker/settings.json
{
"filesharingDirectories" : [
"\/Users",
"\/Volumes",
"\/private",
"\/tmp",
"\/var\/tmp"
],
…
现在我可以在Docker->首选项->资源->文件共享中看到目录/var/tmp
。然后我重新启动了 docker.
然后解决了我的挂载问题
当我从 docker 首选项中的文件共享中删除项目路径并重新启动 docker 时,我的问题得到解决, 然后重新添加项目文件路径。
对于 netcoreapp,请确保您已共享 /usr/local/share/
卸载版本 20 并下载稳定的旧版本 https://desktop.docker.com/mac/stable/48506/Docker.dmg
对于 mac 的 Docker 新版本 3.0.0,您需要在“首选项”>“实验性功能”中禁用使用 gRPC FUSE 进行文件共享。
在当前最新版本(Docker 3.0.2)中,在 macos 中,您必须允许读取目录 docker:
您必须同时添加 /private/var/tmp 和 /var/tmp 才能解决问题
先决条件:需要安装 'docker desktop',
按照图像中提到的步骤操作:
如果您在 MAC 上仍然遇到此问题,请尝试添加:$PWD
在本地文件目录路径前添加 $PWD,如下所示:docker 运行 -v $PWD/folders/:/path/to/directory.
如果您在 mac 上看不到文件夹,请打开终端取消隐藏并键入:
默认写入 com.apple.Finder AppleShowAllFiles 是
然后通过按住 alt 并右键单击(两根手指)finder 来重新启动 finder,然后 select 重新启动然后单击菜单栏中文件旁边的“finder”,单击首选项在硬盘中添加一个检查下面的磁盘在桌面上显示这些项目然后侧边栏也检查那里的硬盘然后转到隐藏文件夹并将其拖动到您的收藏夹它会显示在 docker> 首选项 > 资源 > 文件共享 > + window