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

pao*_*olo 6 pipe stdin docker

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

容器以 开头-it,因此我可以docker attach <container-name>输入文本,使用 Enter 发送并使用 分离^p ^q

我试过docker exec <container-name> echo my-text,但这会回显到标准输出,而不是 java 程序。我可以以某种方式将它传递给 java 程序吗?

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

小智 8

我会将其添加为对上一个答案的评论,但由于是新用户而无法添加。

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

socat EXEC:"docker attach container0",pty STDIO
Run Code Online (Sandbox Code Playgroud)

Ctrl-c 会被 socat 捕获,不会传递给容器。您可能会看到终端控制代码,具体取决于容器使用它的 tty 做什么。

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

echo "echo \"Hello World\"" | socat EXEC:"docker attach container0",pty STDIN
Run Code Online (Sandbox Code Playgroud)

请注意使用 STDIN 而不是 STDIO。

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


Mat*_*att 6

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

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

socat EXEC:"docker run -ti debian bash",pty \
      TCP-LISTEN:7977,bind=127.0.0.1,fork
Run Code Online (Sandbox Code Playgroud)

这会创建一个用于连接的 TCP 端口。端口将所有内容来回转发到docker runcli 进程:

? nc 127.0.0.1 7977
root@045041cf8e60:/# whoami
whoami
root
root@045041cf8e60:/# ^C
Run Code Online (Sandbox Code Playgroud)

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