适用于 Mac 的 Docker卷挂载的行为与基本 Docker 系统不同。这主要是因为 Docker 试图遵守 Apple 的文件系统沙箱指南。
如 Docker 首选项中所示,macOS 仅导出某些路径。
/Users
/Volumes
/tmp
/private
![File Sharing preference panel](https://i.stack.imgur.com/wK5AX.png)
/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
Why is /tmp
列在共享面板中,但是/var
不是(尽管两者都是/private
)?适用于 Mac 的 Docker有关文件系统名称空间的文档解释:
默认情况下,您可以在以下位置共享文件/Users/
, /Volumes/
, /private/
, and /tmp
直接地。要添加或删除导出到 Docker 的目录树,请使用 Docker 首选项鲸鱼中的文件共享选项卡
菜单 -> 首选项 -> 文件共享。 (请参阅首选项。)
中使用的所有其他路径-v
绑定挂载源自运行 Docker 容器的 Moby Linux VM,所以诸如此类的论点-v /var/run/docker.sock:/var/run/docker.sock
应该按预期工作。如果 macOS 路径未共享并且虚拟机中不存在,则尝试绑定挂载该路径将会失败,而不是在虚拟机中创建它。VM 中已存在且包含文件的路径由 Docker 保留,无法从 macOS 导出。
注意/var/run
此处特别提到的是从 Linux VM 而不是从 macOS 挂载的位置。
当您请求挂载卷时,首先检查 macOS 文件系统导出。如果没有匹配,则接下来检查运行 Docker 的 Linux 虚拟机。如果它们都没有您请求的路径,则挂载失败。
就你而言,/var
macOS 不导出。/var
存在于 Linux VM 中,但是/var/folders
才不是。因此路径不可用,挂载失败。
如果您将路径更改为/private/var
,那么就会成功,因为macOS导出了整个/private
用于安装的文件系统树。
为了使事情更加可移植,您可能需要测试当前正在运行的平台,如果是 macOS,请在安装路径前添加前缀/private
.