docker 容器文件夹中的命名管道通过 boot2docker 安装到 mac os x 文件系统

Named pipes in docker container folder mounted to mac os x file system through boot2docker

我正在使用 Mac OS X 上的 boot2docker 通过 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) Mac OS X with boot2docker

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 在 Linux guest 运行 docker 守护进程或在 OS X 主机中,而不是在两者中,并且您不能从内部创建 OS X fifo 是有道理的linux 框。这有点像试图在网络驱动器上创建一个 fifo,它作为本地 IPC 机制没有意义。

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

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