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 应用程序中的关闭管道错误

从 php 在命名管道上运行 shell 命令

如何将 Kafka 消息通过管道传输到 docker 容器中?

使用本地文件共享中的块将 .NET Core docker 容器部署到 Azure

理解Docker容器的进程管理

Docker 容器中的 TypeScript SonarQube 扫描