在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