我正在使用Mac OS X上的boot2docker通过docker image包装一些科学软件。该软件(https://github.com/voutcn/megahit.git)使用命名管道(在python代码中,但这并不重要) )以将不同的部分(用C编写)相互连接。我从主机Mac OS X机器安装了临时文件夹,以在docker容器中提供临时区域(因为软件的临时输出可能非常大),如下所示:
docker run -v /external/folder:/tmp/scratch <image> <args>
它给了我这个在容器内的安装线:
none on /tmp/scratch type vboxsf (rw,nodev,relatime)
在容器中运行的此名为管道创建的已安装文件夹内部失败。它甚至与python,C或任何特定语言都不相关。我mkfifo pipe1
在这个文件夹中用linux命令仔细检查了一个错误:
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)形象建设:
docker build --rm -t mine/namedpipes:latest .
4)运行(位于要挂载的外部主机文件夹中):
docker run -v $(pwd):/tmp/scratch mine/namedpipes:latest
升级到适用于Mac的Docker的最新版本,您的问题将很可能得到解决:https : //docs.docker.com/docker-for-mac/release-notes/#beta-2-release-2016-03-08 -1102-beta2
问题是FIFO实际上是您使用文件系统访问的内核对象,因此您需要额外的工作来支持跨内核FIFO(或Unix域套接字)-FIFO在运行docker守护程序的Linux guest虚拟机中有效,或者在OS X主机,而不是两者都存在,因此您不能在linux盒内创建OS X fifo,这是有道理的。这有点像试图在网络驱动器上创建一个fifo,这作为本地IPC机制没有意义。
https://docs.docker.com/docker-for-mac/osxfs/#file-types中详细介绍了当前对特殊文件的支持
跨系统管理程序支持的问题位于https://github.com/docker/for-mac/issues/483
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句