Macos docker容器文件夹中的命名管道通过boot2docker装载到mac os x文件系统

Macos docker容器文件夹中的命名管道通过boot2docker装载到mac os x文件系统,macos,docker,named-pipes,boot2docker,Macos,Docker,Named Pipes,Boot2docker,我正在使用Mac OS X上的boot2docker,通过docker image包装一些科学软件。该软件()使用命名管道(在python代码中,但并不重要)将不同的部分(用C编写)连接到彼此。我从主机Mac OS X机器上挂载临时文件夹,以便在docker容器中提供临时区域(因为软件的临时输出可能很大),如下所示: docker run -v /external/folder:/tmp/scratch <image> <args> 在这个名为pipe的挂载文件夹中,当

我正在使用Mac OS X上的boot2docker,通过docker image包装一些科学软件。该软件()使用命名管道(在python代码中,但并不重要)将不同的部分(用C编写)连接到彼此。我从主机Mac OS X机器上挂载临时文件夹,以便在docker容器中提供临时区域(因为软件的临时输出可能很大),如下所示:

docker run -v /external/folder:/tmp/scratch <image> <args>
在这个名为pipe的挂载文件夹中,当它在容器中运行时,创建失败。它甚至与python、C或任何特定语言都没有关系。我在这个文件夹中用linux命令
mkfifo pipe1
仔细检查了一下,发现一个错误:

mkfifo: cannot create fifo 'pipe1': Operation not permitted
它适用于容器内任何未装入的内部文件夹。为什么会发生这种情况?如何解决

PS:以下是我如何轻松重现问题的方法

1) 带boot2docker的Mac OS X

2) Dockerfile是:

FROM ubuntu:14.04
#WORKDIR /tmp <- this one would work
WORKDIR /tmp/scratch
ENTRYPOINT [ "mkfifo" ]
CMD [ "pipe1" ]
4) 正在运行(位于要装载的外部主机文件夹中):


升级到Docker for Mac的最新版本,您的问题可能会得到解决:

问题是,fifo实际上是使用文件系统访问的内核对象,因此需要额外的工作来支持跨内核fifo(或unix域套接字)-fifo在运行docker守护程序的Linux客户机内部或在OS X主机中有效,而不是在两者中都有效,而且,您不能从linux机器内部创建OSX fifo也是有道理的。这有点像试图在网络驱动器上创建fifo,作为本地IPC机制是没有意义的

中详细介绍了当前对特殊文件的支持

跨虚拟机监控程序支持的问题位于

FROM ubuntu:14.04
#WORKDIR /tmp <- this one would work
WORKDIR /tmp/scratch
ENTRYPOINT [ "mkfifo" ]
CMD [ "pipe1" ]
docker build --rm -t mine/namedpipes:latest .
docker run -v $(pwd):/tmp/scratch mine/namedpipes:latest