Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 他拒绝了。路径。。。不是从OS X共享的,Docker也不知道_Macos_Docker_Docker For Mac - Fatal编程技术网

Macos 他拒绝了。路径。。。不是从OS X共享的,Docker也不知道

Macos 他拒绝了。路径。。。不是从OS X共享的,Docker也不知道,macos,docker,docker-for-mac,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 -> Pre

命令
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/var/folders
替换了文件共享中的
/private
,并重新启动了docker,但结果没有改变

作为更完整的参考,这是,它运行,然后运行docker命令

卷装载的行为与基本Docker系统不同。这主要是因为Docker试图遵守苹果的文件系统沙箱准则

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

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

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
的一部分)?Mac的Docker解释道:

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

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

注意,
/var/run
在这里特别提到,它是一个从Linux虚拟机而不是从macOS装载的位置

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

在您的情况下,
/var
不是由macOS导出的<代码>/var存在于Linux虚拟机中,但
/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(High Sierra),我两个都试过了。同样的问题。此外,我还尝试使用Docker Beta频道。我想我理解Dan Lowe的答案:如果这个答案对我有效,我会更新这个答案。

作为一个备选方案解决方案:

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

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


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

我遇到了一个类似的问题,我在Mac中创建了一个目录
/var/tmp
,我想将它装入docker容器

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

$ cat ~/Library/Group\ Containers/group.com.docker/settings.json  
{
  "filesharingDirectories" : [
    "\/Users",
    "\/Volumes",
    "\/private",
    "\/tmp",
    "\/var\/tmp"
  ],
…
现在我可以在Docker->preference->resources->file Share中看到目录
/var/tmp
。然后我重新启动了码头工人


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

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

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

卸载版本20并下载旧版本stable

对于新版本的Docker For mac,您需要在“首选项”>“实验功能”中禁用使用gRPC FUSE进行文件共享。

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


你试过
-v/private/var/folders/zz/…
吗?@DanLowe:我没有试过,因为代码像
WORKING_DIR=“$(mktemp-d)
-v${WORKING_DIR}
。但是把它改成
WORKING_DIR=“/private”$(mktemp-d)
,似乎解决了这个问题。非常感谢:)我会在我有几分钟的时间后发布一个答案,解释它为什么有效。那太好了,再次感谢。我遇到了相同的错误消息。我的情况是,您的目录中不包含任何空间,我更改为“服务器端”t