我正在使用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