我正在尝试使用给定的 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 调用使用附加命令,例如 http://localhost:4243/containers/container_id/attach?stdin=1&stdout=1 (4243 是 Docker 监听命令的位置),stdin 和 stdout 标志用于启用流。该文档有标志详细信息。调用电话后,我想与我的容器“交互”。根据 api 文档这是可能的,但是我有点不清楚如何做到这一点。
帮助将不胜感激!
最佳答案
您可以使用允许您从 Java 程序与 docker 交互的库之一。两种可能的替代方案是 docker-client和 docker-java 。 Docker-client 在附加标准输入时存在一些问题,这些问题列在 issue#156 中。有一个known work-around使用一些肮脏的反射来解决这个问题(它确实对我有用)。因此,要使用给定的 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
单独线程中的对象。要写入标准输入,请使用上面链接的技巧来获取 WritableByteChannel
并在其中写入您想要的任何内容。
docker-java 库似乎解决了类似的标准输入问题(请参阅 issue#253 ),尽管我从未使用过 docker-java。
关于java - 使用 Docker api 连接到容器后如何使用 stdin、stdout 和 stderr 流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35449410/