通过boot2docker将命名管道映射到Mac OS X文件系统中的Docker容器文件夹

7
我正在使用boot2docker在Mac OS X上封装一些科学软件的docker镜像。而这个软件(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或任何特定语言都无关。我通过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) 图像构建:

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

4) 运行(在外部主机文件夹中以挂载的方式):

docker run -v $(pwd):/tmp/scratch mine/namedpipes:latest
1个回答

2
升级到最新版本的Docker for Mac,你的问题可能会得到解决: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 box中创建一个OS X fifo是没有意义的。这有点像试图在网络驱动器上创建FIFO,作为本地IPC机制是没有意义的。
当前特殊文件的支持详见https://docs.docker.com/docker-for-mac/osxfs/#file-types 交叉虚拟化支持的问题请参考https://github.com/docker/for-mac/issues/483

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接