命令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,它运行this python script,然后运行docker命令。
答案 0 :(得分:72)
Docker for Mac卷安装的行为与基本Docker系统不同。这主要是因为Docker试图遵守Apple的文件系统沙箱指南。
如Docker首选项所示,macOS只导出某些路径。
/Users
/Volumes
/tmp
/private
/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' documentation about filesystem namespaces解释说:
默认情况下,您可以直接在
/Users/
,/Volumes/
,/private/
和/tmp
内共享文件。要添加或删除导出到Docker的目录树,请使用Docker首选项鲸鱼中的“文件共享”选项卡 菜单 - >偏好 - >文件共享。 (参见偏好。)
-v
绑定挂载中使用的所有其他路径都来自运行Docker容器的Moby Linux VM,因此-v /var/run/docker.sock:/var/run/docker.sock
之类的参数应该按预期工作。如果macOS路径未共享且在VM中不存在,则尝试绑定安装它将失败而不是在VM中创建它。 VM中已存在的路径和包含文件的路径由Docker保留,无法从macOS导出。
请注意,此处明确提到/var/run
是从Linux VM安装而不是从macOS安装的地方。
当您要求卷装入时,首先检查macOS文件系统导出。如果那里没有匹配,则接下来检查运行Docker的Linux VM。如果它们都没有您请求的路径,则挂载失败。
在您的情况下,macOS不会导出/var
。 Linux VM中存在/var
,但/var/folders
没有。因此,路径不可用,并且安装失败。
如果您将路径更改为/private/var
,那么它将成功,因为macOS导出整个/private
文件系统树以进行安装。
为了使事情更具可移植性,您可能需要测试当前正在运行的平台,如果是macOS,请在安装路径前加上/private
。
答案 1 :(得分:16)
使用适用于Mac的新版本3.0.0 Docker,您需要在“偏好设置”>“实验功能”中禁用对文件共享使用gRPC FUSE。
答案 2 :(得分:6)
作为替代解决方案:
将路径从/private/instance1-data:/home
更改为./instance1-data:/home
在* nix地域(即Docker)中,.
表示当前目录。由于macOS挑剔,甚至使沙盒挑剔,这似乎是macOS的可行解决方案。只需在同一目录中创建instance1
所需的文件夹即可。
此解决方案的另一个优点是,它无需使用docker-compose
运行sudo
。无论如何,在这种情况下它不会造成任何伤害,但还是有好处的。
答案 3 :(得分:6)
卸载版本20并下载稳定的旧版本https://desktop.docker.com/mac/stable/48506/Docker.dmg
答案 4 :(得分:5)
我有一个类似的问题,我在Mac中创建了一个目录/var/tmp
,我想将其挂载到Docker容器中。
通过将目录路径添加到文件中来解决该问题,如下所示:
$ cat ~/Library/Group\ Containers/group.com.docker/settings.json
{
"filesharingDirectories" : [
"\/Users",
"\/Volumes",
"\/private",
"\/tmp",
"\/var\/tmp"
],
…
现在,我可以在Docker-> preference-> resources->文件共享中看到目录/var/tmp
。然后,我重新启动了docker。
然后解决了我的安装问题。
答案 5 :(得分:2)
例如,使用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的回答:如果这对我有用,我会更新这个答案。
答案 6 :(得分:1)
答案 7 :(得分:1)
答案 8 :(得分:0)
当我在Docker首选项中从文件共享中删除项目路径并重新启动Docker时,我的问题已解决, 然后再次添加项目文件路径。
答案 9 :(得分:0)
您必须同时添加 /private/var/tmp 和 /var/tmp 才能解决问题
答案 10 :(得分:-1)
对于netcoreapp,请确保您已共享/ usr / local / share /