我有一个 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 run
cli 进程:
→ nc 127.0.0.1 7977
root@045041cf8e60:/# whoami
whoami
root
root@045041cf8e60:/# ^C
控制字符是本地的nc
,因此容器继续运行。