我有一个在 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/