Java 在使用Docker api连接到容器后,如何使用stdin、stdout和stderr流?

Java 在使用Docker api连接到容器后,如何使用stdin、stdout和stderr流?,java,api,nginx,docker,stream,Java,Api,Nginx,Docker,Stream,我正在尝试使用给定的api连接到容器 我有一个基于docker hub nginx映像的容器。我可以发送一个附加到它的请求,并保存stderr、stdin和stdout的标志。我的目标是以交互方式使用它们 我无法理解如何使用java使用流,即发送命令和读取输出的过程 我使用的是Docker版本1.10.1。Api v1.22。正在使用的操作系统是Ubuntu 14.04。该应用程序使用JDK1.8 我的重点是通过api调用使用attach命令,如 (4243是Docker侦听命令的地方),std

我正在尝试使用给定的api连接到容器

我有一个基于docker hub nginx映像的容器。我可以发送一个附加到它的请求,并保存stderr、stdin和stdout的标志。我的目标是以交互方式使用它们

我无法理解如何使用java使用流,即发送命令和读取输出的过程

我使用的是Docker版本1.10.1。Api v1.22。正在使用的操作系统是Ubuntu 14.04。该应用程序使用JDK1.8

我的重点是通过api调用使用attach命令,如 (4243是Docker侦听命令的地方),stdin和stdout标志用于启用流。该文档具有标记详细信息。打完电话后,我想与我的容器“交互”。这是可能的,根据api文档,但我有点不清楚如何做到这一点


谢谢你的帮助

您可以使用其中一个库,它允许您从Java程序与docker进行交互。两种可能的选择是和。Docker client在连接stdin时遇到一些问题,如中所列。有一种方法可以使用一些肮脏的反射来修复这个问题(它对我来说真的很有用)。因此,要使用给定的
id
在现有容器中启动交互式应用程序,请使用:

DockerClient dockerClient = DefaultDockerClient.builder()
      .uri( dockerURI )
      .readTimeoutMillis( Long.MAX_VALUE ) // without this interactive session may disconnect
      .build(); // use other config options if appropriate

String execId = dockerClient.execCreate(id, new String[] {"/bin/bash"}, 
    ExecCreateParam.attachStdin(), ExecCreateParam.attachStdout(),
    ExecCreateParam.attachStderr(), ExecCreateParam.tty() );
LogStream ls = dockerClient.execStart( execId );
现在使用
ls.attach(stdout,stderr)
将应用程序stdout,stderr重定向到单独线程中您自己的
OutputStream
对象。要写入stdin,请使用上面链接的技巧获取可由Techannel写入的
,然后根据需要写入它


docker java库似乎已经解决了类似的stdin问题(请参阅),但我从未使用过docker java。

在发送请求后,我是否应该只写stdin并尝试读取stdout和stderr?是的。你的问题还不清楚。你能提供更多的细节,特别是你正在使用的命令,你所处的环境(至少是操作系统)吗?我更新了这个问题。如果出现任何问题,请告诉我。是的,您执行的所有命令仍然丢失。您是否尝试了
docker-attach
docker-exec-it
?您想使用Java应用程序中的API吗?此应用程序如何执行API调用?您是否检查了
docker attach
源代码(因为您想执行相同的任务)?Auzias,是的,这些是您可以从终端调用的命令。我正在尝试使用Java应用程序中的API。我注意到,根据源代码,您可以以交互方式与容器对话,因此我希望attach可以给我提供与给我exec-it bash相同的结果。我正在尝试实现以下场景的代码-我们可以通过命令行使用exec-it启动并连接到bash程序。我希望能够使用api做到这一点,我发现attach最适合这个需求。想法?@AdityaPan,我添加了更多关于如何使用docker客户端进行交互式bash会话的详细信息。这对我来说非常合适。可能docker java更好,您也可以尝试一下(我们刚刚开始使用docker客户端,不想迁移)。我将尝试一下,并很快更新我的发现。谢谢你的帮助@Tagir Valeev!