Java 使用ProcessBuilder运行docker compose up成功,但ProcessBuilder未返回结果
我正在运行docker compose和ProcessBuilder,我的机器中的一切都很好。我通过读取流o/p来获取开始的图像细节。 现在,我已经将其打包在一个jar中,并作为maven依赖项添加到另一个项目中。该命令运行良好,但我无法获取任何详细信息。ProcessBuilder流看起来是空的。但我可以看到docker图像正在运行 我结合了输入和错误数据。但两者都是空的。 作为一种解决方法,我在命令下运行Java 使用ProcessBuilder运行docker compose up成功,但ProcessBuilder未返回结果,java,docker,jar,docker-compose,processbuilder,Java,Docker,Jar,Docker Compose,Processbuilder,我正在运行docker compose和ProcessBuilder,我的机器中的一切都很好。我通过读取流o/p来获取开始的图像细节。 现在,我已经将其打包在一个jar中,并作为maven依赖项添加到另一个项目中。该命令运行良好,但我无法获取任何详细信息。ProcessBuilder流看起来是空的。但我可以看到docker图像正在运行 我结合了输入和错误数据。但两者都是空的。 作为一种解决方法,我在命令下运行 docker inspect --format='{{range .NetworkSe
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}
{{end}}' <<container name>>
docker-inspect--format={{range.NetworkSettings.Networks}}{{{.IPAddress}
{{end}}'
在ProcessBuilder中,如果我直接在终端上运行,它可以正常工作,但也不会返回IP地址
public List<String> execute(String directory, String command) {
List<String> commands = new ArrayList<>();
commands.add("bash");
commands.add("-c");
commands.add(command);
Process dockerComposeCommand;
ProcessBuilder builder = new ProcessBuilder().inheritIO();
builder.command(commands);
builder.directory(new File(directory).getParentFile());
String path = System.getenv("PATH");
builder.environment().put("PATH","/usr/bin:"+path);
builder.redirectErrorStream(true);
builder.redirectError(ProcessBuilder.Redirect.INHERIT);
List<String> result = new ArrayList<>();
try {
dockerComposeCommand = builder.start();
dockerComposeCommand.waitFor();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(dockerComposeCommand.getInputStream()))) {
String line = reader.readLine();
while (line != null) {
result.add(line);
line = reader.readLine();
}
}
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
return result;
}
公共列表执行(字符串目录,字符串命令){
List命令=new ArrayList();
commands.add(“bash”);
命令。添加(“-c”);
命令。添加(命令);
处理dockercompose命令;
ProcessBuilder=新的ProcessBuilder().inheritIO();
builder.command(命令);
builder.directory(新文件(directory.getParentFile());
字符串路径=System.getenv(“路径”);
builder.environment().put(“PATH”,“/usr/bin:”+PATH);
builder.redirectErrorStream(true);
重定向错误(ProcessBuilder.Redirect.INHERIT);
列表结果=新建ArrayList();
试一试{
dockerComposeCommand=builder.start();
dockerComposeCommand.waitFor();
try(BufferedReader=new BufferedReader(new InputStreamReader(dockerComposeCommand.getInputStream())){
字符串行=reader.readLine();
while(行!=null){
结果。添加(行);
line=reader.readLine();
}
}
}捕获(IOException | InterruptedException e){
e、 printStackTrace();
}
返回结果;
}
我想从ProcessBuilder中获得容器的详细信息,我在本地机器中获得了该容器的解决方案。我刚刚注释了Inheritaio(),如下所示
ProcessBuilder builder = new ProcessBuilder();//.inheritIO();
还有一点是,如果代码中有Inheritario(),则输出将在调用程序的控制台中打印
正如@DavidMaze提到的,这些IP没有任何用处。因此,我添加了另一种方法来检查docker容器的状态。该IP地址在许多情况下基本上是无用的。千万别查。从容器外部,您应该连接到主机的IP地址(或
localhost
当且仅当您在同一物理主机上的Docker外部运行时),以及Docker run-p
选项中的第一个端口号。谢谢@DavidMaze。但是,我如何确保我的容器已装满?我应该只使用ProcessBuilder的退出代码吗?