docker - Docker 容器和主机之间的共享命名管道 - 跨平台

标签 docker ubuntu

我有一个在 Ubuntu Docker 容器 ( ubuntu-python ) 中创建的命名管道。我想从主机操作系统向这个管道发送数据,并从容器中的管道读取数据。

容器内:

我使用以下方法在容器内创建了管道

mkfifo 流

然后我使用

从流中读取

猫流

正如预期的那样,该命令似乎挂起,因为它正在等待一些输入

Docker 文件

然后我使用卷将命名管道共享到主机操作系统

    volumes:
      - ./audio:/app/audio # stream is inside /app/audio

主机操作系统

我跑了

sudo bash -c "echo test > stream"

我希望这会写入流,这应该会导致原始 cat stream 命令取消挂起并打印 test,但输入和输出命令都继续挂起,表明数据实际上并未移动到容器中。我使用 bash -c 的原因是因为我需要 redirection to run as root .

在主机容器上运行的这一系列命令完美运行,但是一旦我引入主机和容器之间的数据量和移动,它就不再运行了。如何将数据从主机操作系统写入命名管道并使其显示在容器中?

作为引用,主机是运行 Ubuntu 20.04 的 WSL,但我计划将其部署在运行 Raspbian Lite 的 Raspberry Pi 3B+ 上。我还想将它分发给开源项目的其他用户,因此该解决方案应该与主机无关(至少对于可以实际运行 Ubuntu 容器的主机)。

最佳答案

使用 mkfifo -m a+rw stream 将允许任何用户写入流,而不仅仅是 root 用户。这是因为 -m 允许您指定类似于 chmod 的管道权限。因此,重定向不再需要以 root 身份运行。

现在我们可以简单地从主机操作系统使用 echo test > stream,输出将正确显示在容器中。

我不确定为什么使用 bash -c 写入管道实际上并没有将数据移动到容器中,而是 -m 标志为 mkfifo 表示我们不需要使用它。

关于docker - Docker 容器和主机之间的共享命名管道 - 跨平台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65385472/

相关文章:

docker - 如何使用Rexster Docker镜像和灯泡在TinkerPop/Rextser中创建图形数据库?

Eclipse 3.5 和 Ubuntu 9.10,颠覆客户端不工作

docker - Firefox Headless 无法以非 root 用户身份在 Docker 中工作

docker - 在 Windows 上一次停止所有 docker 容器

mysql - 创建一个简单的dot net core和mysql docker容器组合

python-3.x - Python gspread获取accessNotConfigured-未找到项目(编号),并且无法用于API调用

php7 :error pid 12451 PHP Fatal error: require(): Failed opening required

php - composer selfupdate 连接被对等方重置

javascript - 错误 : ENOENT: no such file or directory, 状态 '/home/arpit/.steampath'

c# - 从 VS Code (windows) 将 winform 解决方案导入单声道 (linux)