如何在Java应用程序中使用docker命令运行docker命令或shell脚本



我需要从java应用程序运行一些docker命令。到目前为止,我已经搜索并尝试了运行时exec和processBuilder方法,但它不起作用。我最后一次尝试是用processBuilder试图执行一个包含docker pull命令的bash脚本。

没有打印到eclipse IDE控制台,尽管当我修改.sh文件以执行echo 'i am responding'时,它被打印到控制台。为了调试代码,我修改了.sh脚本,将docker pull的标准输出和标准错误重定向到一个文件中。打开结果文件后,我得到:line 11: docker: command not found,而当我在终端上运行它时,docker命令工作正常。因此,我认为问题在于java代码本身。我哪里做错了?如有任何帮助,不胜感激。

注意:我也听说过并尝试过Spotify的Docker -client库,但我想我对Docker的了解目前还不足以设置它。我正在使用MacOS Big Sur。下面是java代码:

public static void main(String[] args) throws IOException {
Common cm = new Common();
String userDir = cm.getuserDirectory();
String sp = cm.getfileSeparator();
String filePath = userDir + sp + "src" + sp +  "data" + sp + "pull-and-run.sh";

String[] cmd = {"sh", filePath};

ProcessBuilder processBuilder = new ProcessBuilder(cmd);
processBuilder.directory(new File(userDir + sp + "src" + sp +  "data"));

Process process;

try {
process = processBuilder.start();
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));

String line;
System.out.println("Output is: ");
while ((line = br.readLine()) != null) {
System.out.println(line);
}

} catch (IOException e) {
e.printStackTrace();
}
}

答案是";第11行:docker: command not found ";:)

当启动终端时,您正在启动一个shell,并且它的PATH可能设置在类似.bashrc的文件中(或者您正在运行的任何shell的rc文件)。

我知道你从Eclipse中启动你的应用程序,你可能从你的桌面、菜单或应用程序启动器启动Eclipse:所有这些都不会有你的终端所拥有的设置。

验证:

  • 从终端运行应用程序,而不是从Eclipse中运行或
  • 添加"echo $PATH"行,并将其与终端中的echo $PATH run进行比较。

修改:

  • 将docker添加到"全局";桌面会话使用的PATH或
  • 提供脚本中docker的完整路径或
  • 从终端内启动eclipse;它将继承shell的环境

我尝试使用简化版本的代码来复制,创建一个简单的java项目,其中包含Main类和show-docker-version.sh文件(在项目的根目录):

show-docker-version.sh

docker --version

Main.java

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
String filePath = "docker-container-list.sh";
String[] cmd = {"sh", filePath};
ProcessBuilder processBuilder = new ProcessBuilder(cmd);
processBuilder.directory(new File("."));
Process process;
try {
process = processBuilder.start();
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
System.out.println("Output is: ");
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

输出为:

Output is: 
Docker version 20.10.3, build 48d30b5
Process finished with exit code 0

所以docker命令在这里工作!

我尝试过至少两种不同的jdk(8和11),但不是所有的。所以我想知道是否有什么与你的JDK版本有关。另一种可能是由于安装docker而缺乏权限。我不知道您使用的是哪个操作系统,假设是Linux,请考虑查看Linux的安装后步骤:https://docs.docker.com/engine/install/linux-postinstall/