Docker:Mounts被拒绝。 path…不是从OS X共享的,Docker不知道

命令docker运行-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. 

当我打开文件共享,我看到/私人已经列出。

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

总而言之,在我看来,像/ var / folders /这样的目录是OS X作为/ private的一个子目录共享的,因此必须为Docker所知。 任何帮助解决这个将不胜感激。

作为一个实验,我用/ private / var / foldersreplace了文件共享中的/ private,并重新启动了docker,但结果没有改变。

只是为了更完整的参考,这是运行这个python脚本的.sh脚本 ,它运行docker命令。

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

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

  • /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首选项whale菜单 – >首选项 – >文件共享中的文件共享选项卡。 (请参阅首选项。)

-v绑定挂载中使用的所有其他path来源于运行Docker容器的Moby Linux VM,因此参数(如-v /var/run/docker.sock:/var/run/docker.sock应该按预期工作。 如果一个macOSpath不共享并且不存在于虚拟机中,绑定的尝试将失败,而不是在虚拟机中创build。 VM中已经存在并包含文件的path由Docker保留,不能从macOS导出。

请注意, /var/run在这里被特别提到,将作为一个从Linux VM挂载的地方,而不是从macOS挂载。

当你要求卷挂载时,首先检查macOS文件系统导出。 如果没有匹配的话,运行Docker的Linux VM将会被检查。 如果他们都没有你请求的path,那么挂载失败。

在你的情况下, /var不会被macOS导出。 /var存在于Linux VM中,但/var/folders不存在。 因此,该path不可用,并且挂载失败。

如果将path更改为/private/var ,则path将成功,因为macOS会导出整个/private文件系统树以进行装载。

为了使事情更具可移植性,您可能需要testing当前正在运行的平台,如果是macOS,则使用/private前缀安装path。

Interesting Posts