我有一个 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。
可能有比这更好的方法,但到目前为止,这是我发现的最好的方法。
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 run
cli 进程:
? nc 127.0.0.1 7977
root@045041cf8e60:/# whoami
whoami
root
root@045041cf8e60:/# ^C
Run Code Online (Sandbox Code Playgroud)
控制字符是 本地的nc
,因此容器会继续运行。
归档时间: |
|
查看次数: |
5975 次 |
最近记录: |