【问题标题】:How to run Docker container from Java project?如何从 Java 项目运行 Docker 容器?
【发布时间】:2016-04-14 21:07:53
【问题描述】:

如何从 java 代码运行 docker 容器?我正在尝试使用 docker 制作 SaaS,一旦用户登录,我应该从 java 代码启动一个 memcached 容器,这个解决方案不起作用:

Process p = Runtime.getRuntime().exec("docker images");

Docker cmds 通常在 git bash 上运行,而不是在 cmd 上。
PS:我在 windows 上使用 docker。

【问题讨论】:

  • 为什么Java应用程序应该启动一个容器?据我所知,这不是 docker 设计
  • “这个解决方案不起作用”是非常主观的。提供更多详细信息,例如返回的错误。
  • This 是我正在尝试制作的设计,请参阅第 15 页 @Bestbug
  • 没有错误,当我显示结果时,输出值为空,正如我之前所说,docker cmds 运行在 git bash 上,Runtime.getRuntime().exec() 用于 cmd。 @gustavohenke
  • 你是第一次在windows上运行docker吗?在这种情况下可能是错误的 gopath

标签: java docker saas git-bash


【解决方案1】:

我假设您使用的是 Docker Toolbox for Windows。

docker 命令不采用大写字母D。也许试试

Process p = Runtime.getRuntime().exec("docker images");

但由于您可能在 Windows 上运行此代码,因此它可能仍然有效。

要考虑的另一件事是DOCKER_HOST 环境变量的值,必须相应地设置它以指示 docker 客户端如何与 docker 引擎进行通信。

在您的情况下,docker 客户端在 Windows 上运行,而 docker 引擎在 VirtualBox 中的虚拟机中运行。

Runtime.getRuntime().exec() 提供的 shell 不会设置 DOCKER_HOST 环境变量。

另一种方法是使用--host-H docker 客户端选项来指定如何连接到您的docker 引擎:

Process p = Runtime.getRuntime().exec("docker --host=tcp://<some IP>:2376 images");

【讨论】:

  • 感谢您的帮助,答案的第二部分很有帮助。 =)
  • 不执行docker命令,为什么不直接连接API呢?有几个 Java 库允许您通过其 API 连接到 docker 守护程序; docs.docker.com/engine/reference/api/…
  • 是 --host @Thomasleveil
  • @thaJeztah 非常感谢您的选择,我不知道,它真的很有帮助!
  • 那是另一个问题 → 创建一个新问题
【解决方案2】:

对不起,伙计们,当我打开一个新的 shell(客户端)时,我必须对其进行配置才能知道如何连接到在 virtualbox 中运行的 docker 守护进程。我必须运行设置 shell 环境的 cmds,因为快速启动终端会自动执行此操作。所以我必须运行以下命令,然后将输出粘贴回我的 cmd shell:

docker-machine env --shell cmd default

现在可以完美运行了。

更新(感谢@thaJeztah):最好使用 Java 库直接连接到 docker 守护进程。
API 链接https://docs.docker.com/engine/reference/api/remote_api_client_libraries/

【讨论】:

    【解决方案3】:

    您可以使用 https://github.com/docker-java/docker-java 来完成。它允许您构建自定义图像并从 java 运行它

    【讨论】:

      猜你喜欢
      • 2022-01-09
      • 1970-01-01
      • 2019-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 2022-09-23
      • 1970-01-01
      相关资源
      最近更新 更多