在Docker容器文件夹中的命名pipe道通过boot2docker挂载到mac os x文件系统

我正在使用Mac OS X上的boot2docker封装一些科学软件。而这个软件( https://github.com/voutcn/megahit.git )使用的是命名pipe道(在python代码中,但并不重要)将不同的部分(用C写)互相连接。 我从主机Mac OS X机器上安装临时文件夹,以便在Docker容器中提供临时区域(因为软件的临时输出可能很大),如下所示:

docker run -v /external/folder:/tmp/scratch <image> <args> 

它给了我这个容器内的挂载线:

 none on /tmp/scratch type vboxsf (rw,nodev,relatime) 

并且在这个挂载的文件夹中,当它在容器中运行时,命名pipe道创build失败 它甚至与python,C或任何特定的语言都没有关系。 我mkfifo pipe1检查与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" ] 

3)形象build设:

 docker build --rm -t mine/namedpipes:latest . 

4)正在运行(在要安装的外部主机文件夹中):

 docker run -v $(pwd):/tmp/scratch mine/namedpipes:latest 

升级到最新版本的Docker for Mac,你的问题可能会解决: https : //docs.docker.com/docker-for-mac/release-notes/#beta-2-release-2016-03-08 -1102-β2

问题是FIFO实际上是使用文件系统访问的内核对象,因此您需要额外的工作来支持跨内核FIFO(或unix域套接字) – fifo可以在运行docker守护进程的Linux客户机内有效,或者OS X主机,而不是两者都有,而且你不能从linux内部创build一个OS X fifo。 这就好比试图在networking驱动器上创build一个fifo,作为一个本地IPC机制是没有意义的。

当前对特殊文件的支持详见https://docs.docker.com/docker-for-mac/osxfs/#file-types

跨系统pipe理程序支持的问题位于https://github.com/docker/for-mac/issues/483