java - 使用 Docker api 连接到容器后如何使用 stdin、stdout 和 stderr 流?

标签 java api nginx docker stream

我正在尝试使用给定的 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-clientdocker-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/

相关文章:

nginx - 我如何按日期拆分 nginx error.log?

python - 如果我不提供任何静态内容,我是否需要 Nginx 和 Gunicorn?

mysql - 拉维尔 |唯一验证 where 子句

android - 你能改变分钟吗? Eclipse 中您的 Android 应用程序的 API 级别?

javascript - Node js Adwords API

java - 如何覆盖 Lombok Setter 方法

docker - 将简单的docker compose连接到nginx?

构造 URL 对象时出现 Java MalformedURL 异常

java - 如何在带有 WTK 3.0 的 Mac OS X 上启动两个 J2ME Midlet。

java - Android:是否可以将图像上传到服务器内的文件夹中?