如何将文本发送到docker容器的标准输入?

如何将文本发送到docker容器的标准输入?

我有一个 docker 容器,它在启动时在前台运行一个 java 程序。该 java 程序监听输入stdin。我如何以编程方式将文本发送到 java 程序?

容器以 启动-it,因此我可以docker attach <container-name>键入文本,使用 Enter 发送,然后使用 分离^p ^q

我试过了docker exec <container-name> echo my-text,但这被回显到 stdout,而不是 java 程序。我能以某种方式将其传送到 java 程序吗?

我还发现了Docker 论坛中也有类似的问题,但该解决方案的使用screen,我宁愿有一个更清洁的解决方案。

答案1

我想将此作为评论添加到上一个答案中,但由于是新用户而无法添加。

socat 可以在不使用网络的情况下使用,例如,您可以使用以下命令连接到名为 container0 的容器:

socat EXEC:"docker attach container0",pty STDIO

Ctrl-c 将被 socat 捕获,不会传递给容器。您可能会看到终端控制代码,具体取决于容器对其 tty 执行的操作。

您还可以将命令通过管道传输到容器。例如,如果您的容器正在其 tty 上运行 shell,并且您想让它运行 echo "Hello World",而并不关心或想要返回输出

echo "echo \"Hello World\"" | socat EXEC:"docker attach container0",pty STDIN

请注意使用 STDIN 而不是 STDIO。

可能有比这更好的方法,但到目前为止这是我发现的最好的方法。

答案2

socat可以运行命令并将 tty 转发给“某物”。

一个例子是创建一个网络服务器:

socat EXEC:"docker run -ti debian bash",pty \
      TCP-LISTEN:7977,bind=127.0.0.1,fork

这将创建一个 TCP 端口,用于连接。该端口将所有内容转发给docker runcli 进程:

→ nc 127.0.0.1 7977
root@045041cf8e60:/# whoami
whoami
root
root@045041cf8e60:/# ^C

控制字符是本地的nc,因此容器继续运行。

相关内容