我需要从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/