如何在使用 Docker API 附加到容器后使用 stdin、stdout 和 stderr 流



>我正在尝试使用给定的 api 附加到容器 https://docs.docker.com/engine/reference/api/docker_remote_api_v1.22/

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

我无法弄清楚如何使用 java 的流,即发送命令和读取输出的过程。

我使用的是 Docker 版本 1.10.1。API v1.22.正在使用的操作系统是 Ubuntu 14.04。应用程序使用 JDK 1.8。

我专注于通过 api 调用使用 attach 命令,例如http://localhost:4243/containers/container_id/attach?stdin=1&stdout=1(4243 是 Docker 侦听命令的地方(和 stdin 和 stdout 标志用于启用流。该文档包含标志详细信息。发出调用后,我想与我的容器"交互"。根据 API 文档,这是可能的,但是我不清楚如何做到这一点。

帮助将不胜感激!

您可以使用其中一个库,该

库允许您从Java程序与Docker进行交互。两种可能的替代方案是docker-client和docker-java。Docker-client 在附加 stdin(标准(时存在一些问题,这些问题列在问题 #156 中。有一个已知的解决方法可以使用一些肮脏的反射来解决此问题(它真的对我有用(。因此,要在具有给定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,请使用上面链接的技巧获取WritableByteChannel并写入您想要的任何内容。

docker-java 库似乎解决了类似的 stdin 问题(参见问题 #253(,尽管我从未使用过 docker-java。

相关内容

  • 没有找到相关文章

最新更新