docker容器文件夹中的命名管道通过boot2docker挂载到mac os x文件系统
Posted
技术标签:
【中文标题】docker容器文件夹中的命名管道通过boot2docker挂载到mac os x文件系统【英文标题】:Named pipes in docker container folder mounted to mac os x file system through boot2docker 【发布时间】:2015-11-19 22:30:28 【问题描述】:我正在使用 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) 带有 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】:升级到最新版本的 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 客户机中是有效的daemon 或 OS X 主机中,而不是两者中,并且您不能从 linux 框内创建 OS X fifo 是有道理的。这有点像试图在网络驱动器上创建一个先进先出,作为本地 IPC 机制没有意义。
目前对特殊文件的支持详见https://docs.docker.com/docker-for-mac/osxfs/#file-types
跨管理程序支持的问题位于https://github.com/docker/for-mac/issues/483
【讨论】:
以上是关于docker容器文件夹中的命名管道通过boot2docker挂载到mac os x文件系统的主要内容,如果未能解决你的问题,请参考以下文章
SIGPIPE 写入 EBS Docker 应用程序中的关闭管道错误
如何将 Kafka 消息通过管道传输到 docker 容器中?