一个Docker容器中的进程可以写入另一个容器中的进程的stdin吗

时间:2019-01-21 00:22:30

标签: docker docker-compose

我有一个运行在容器A中的应用程序,我想写一个在容器B中运行的进程的stdin。我看到,如果我想从主机上写到B的stdin,我可以使用{{1 }}。实际上,我想从docker attach内致电docker attach B

理想情况下,我希望能够通过A进行配置。也许我可以告诉docker-compose创建一个unix域套接字docker-compose.yml,该套接字通过管道传输到A的stdin,或者将一些魔术端口号连接到B的stdin。

我意识到,如果有必要,我总是可以在B的容器中放置一个小型Web服务器,该服务器将所有输入从B的开放端口重定向到该进程,但我宁愿使用开箱即用的解决方案(如果存在)。

对于对此细节感兴趣的人,我有一个从容器A运行的python应用程序,我希望它与容​​器B中的鳕鱼(象棋引擎)对话。​​

2 个答案:

答案 0 :(得分:1)

一个Docker容器中的进程无法直接使用另一个容器的stdin / stdout / stderr。这是容器“类似于VM”的一种方式。请注意,在没有父子进程关系的普通Linux / Unix中,这也是几乎不可能的。

正如您所说,最好的方法是将HTTP或其他服务放在另一个容器中的进程的前面,或者仅使用单个容器并启动仅通过stdin作为子进程进行通信的事物。 / p>

(如果您给调用进程授予对主机的Docker套接字的访问权限,可能有一种方法可以使这项工作正常进行,但是您可以为它赋予对主机的不受限制的访问权限,并将实现与Docker绑定; HTTP或子进程在没有Docker的情况下,这些路径很容易开发和测试,然后分别移入容器区域,并且不涉及接管主机的可能性。)

答案 1 :(得分:0)

如果有帮助,您可以尝试创建并读写套接字。 并将此套接字安装在两个容器中,例如:

docker run -d -v /var/run/app.sock:/var/run/app.sock:ro someapp1

docker run -d -v /var/run/app.sock:/var/run/app.sock someapp2

免责声明:这只是个主意,我自己从未做过类似的事情