Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用ProcessBuilder运行docker compose up成功,但ProcessBuilder未返回结果_Java_Docker_Jar_Docker Compose_Processbuilder - Fatal编程技术网

Java 使用ProcessBuilder运行docker compose up成功,但ProcessBuilder未返回结果

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 compose和ProcessBuilder,我的机器中的一切都很好。我通过读取流o/p来获取开始的图像细节。 现在,我已经将其打包在一个jar中,并作为maven依赖项添加到另一个项目中。该命令运行良好,但我无法获取任何详细信息。ProcessBuilder流看起来是空的。但我可以看到docker图像正在运行

我结合了输入和错误数据。但两者都是空的。 作为一种解决方法,我在命令下运行

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的退出代码吗?