我有一个在 Ubuntu Docker 容器 ( ubuntu-python )中创建的命名管道。我想从主机操作系统将数据发送到此管道,并从容器的管道中读取数据。
容器内:
我使用以下命令在容器内创建了管道
mkfifo stream
然后我使用从流中读取
cat stream
正如预期的那样,该命令似乎挂起,因为它正在等待某些输入
Docker 文件
然后,我使用卷将命名管道共享到主机操作系统
volumes:
- ./audio:/app/audio # stream is inside /app/audio
Run Code Online (Sandbox Code Playgroud)
主机操作系统:
我跑了
sudo bash -c "echo test > stream"
我希望这会写入流,这应该会导致原始cat stream命令取消挂起并 print test,但输入和输出命令继续挂起,表明数据实际上并未移入容器中。我使用的原因bash -c是因为我需要重定向以 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意味着我们不需要使用它。
| 归档时间: |
|
| 查看次数: |
4192 次 |
| 最近记录: |