码头工人:坐骑被拒绝。路径…不是从OS X共享的,也不为Docker所知


108

该命令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必须知道。解决任何帮助,将不胜感激。

作为实验,我将/privateFile Sharing中的替换为,/private/var/folders然后重新启动了docker,但结果没有改变。

为了提供更完整的参考,这是.sh脚本,该脚本运行此python脚本,该脚本又运行docker命令。


3
你尝试了-v /private/var/folders/zz/...吗?
丹·洛

@DanLowe:我没有,因为代码像WORKING_DIR="$(mktemp -d)-v ${WORKING_DIR}。但是,将其入侵WORKING_DIR="/private"$(mktemp -d)似乎可以解决问题。非常感谢:)
Aayush

我将发布一个答案,解释为什么我在几分钟后可以使用
Dan Lowe

太好了,再次感谢。
Aayush

我遇到相同的错误消息。我的情况是您的目录中不包含任何空间,我将“服务器端”更改为“ serverSide”,然后解决了。希望它可以帮助一些人。
andrew54068

Answers:


129

用于Mac的Docker卷安装的行为与基本Docker系统不同。这主要是因为Docker试图遵守Apple的文件系统沙箱指南。

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

  • /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偏好设置鲸鱼菜单->偏好设置->文件共享中的文件共享选项卡。(请参阅首选项。)

-v绑定安装中使用的所有其他路径均来自运行Docker容器的Moby Linux VM,因此诸如之类的参数-v /var/run/docker.sock:/var/run/docker.sock应该可以正常工作。如果未共享macOS路径且VM中不存在macOS路径,则尝试将其绑定挂载将失败,而不是在VM中创建它。VM中已存在并包含文件的路径已由Docker保留,无法从macOS导出。

请注意,/var/run此处特别提到的是从Linux VM(而不是从macOS)挂载的位置。

当您要求进行卷挂载时,将首先检查macOS文件系统导出。如果不存在匹配项,则接下来检查运行Docker的Linux VM。如果它们都不具有您请求的路径,则安装将失败。

就您而言,/var不是由macOS导出的。/var存在于Linux VM中,但/var/folders不存在。因此,该路径不可用,并且安装失败。

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

为了使事情更容易移植,您可能需要测试当前运行的平台,如果是macOS,则在装载路径前面加上/private


4
@SamuelMéndez只是第一个。格式为mac-path:container-path,并且/private仅存在于Mac一侧。
丹·劳

2
我面临类似的问题,任何人都可以帮助我解决(“ b'Mounts否认:\ r \ n路径/ etc / localtime \ r \ nis未从OS X共享,并且Docker不知道。\ r \ n您可以配置共享路径从Docker->首选项...->文件共享。\ r \ n有关更多信息,请参阅docs.docker.com/docker-for-mac/osxfs/#namespaces。\r\n。'“)尝试通过添加/ etc Docker-> Preferences ...-> File Sharing它说/ etc是为Mac OS保留的,任何解决方案的家伙?
Sandish Kumar HN

1
@DanLowe感谢您的回复。如果我尝试添加/ private / etc / localtime,则会抛出“导出路径/ private / etc / localtime与导出路径/ private重叠”。我累了添加“ / etc / localtime”,但收到新错误,提示“ APIError:500服务器错误:内部服务器错误(“创建装载源路径'/ etc / localtime'时出错:mkdir / etc / localtime:文件存在”) “ 任何想法??
Sandish Kumar HN


1
@DanLowe谢​​谢您的友好回答。我理解你。当我们在Mac OS上进行开发时,请在Ubuntu上进行部署。我们使用docker-compose来卷/ etc / localtime。我们要检查系统并设置其他路径吗?就像/private/etc/localtimeMac OS一样,/etc/localtimeUbuntu也一样。如何在Docker-compose.yml中告诉系统信息?谢谢!
hzwzw

4

作为替代解决方案:

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

在* nix地域中,因此在Docker中,.指示当前目录。由于macOS挑剔,甚至使沙盒挑剔,这似乎是macOS的可行解决方案。只需instance1在同一目录中创建所需的文件夹即可。

该解决方案的另一个优点是,它消除了需要运行docker-composesudo。无论如何,在这种情况下它不会造成任何伤害,但还是有好处的。


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的答案:如果适用于我,我将更新此答案。


2

/var/tmp在Mac中创建了一个要挂载在Docker容器中的目录时遇到了类似的问题。

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

$ cat ~/Library/Group\ Containers/group.com.docker/settings.json  
{
  "filesharingDirectories" : [
    "\/Users",
    "\/Volumes",
    "\/private",
    "\/tmp",
    "\/var\/tmp"
  ],
…

现在,我可以/var/tmp在Docker-> preference-> resources->文件共享中看到该目录。然后,我重新启动了docker。

然后解决了我的安装问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.