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