bash - 在Java应用程序中从Docker收集输出

标签 bash docker processbuilder

我正在使用ProcessBuilder在Java应用程序中的docker上执行一些代码,以运行代码,但是我无法从中检索输出。 BufferedReader不会从容器返回的InputStream中读取任何内容。是否有从Docker检索输出的特定方法?
我以前从未遇到过从bash执行中获取输出的麻烦,所以我想也许docker以某种方式做不同的事情。任何想法,将不胜感激

这是一段代码:

    Process dockerCommand;
    ProcessBuilder builder = new ProcessBuilder("bash","-c","sudo docker images");
    builder.redirectErrorStream(true);
    builder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
    builder.redirectError(ProcessBuilder.Redirect.INHERIT);
    dockerCommand = builder.start();       

    dockerCommand.waitFor();

    List<String> result = new ArrayList<>();
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(dockerCommand.getInputStream()))
    {
        String line = reader.readLine();
        while (line != null) {
            result.add(line);
            line = reader.readLine();
        }
    } 
    catch (IOException exc) 
    {}

最佳答案

线

builder.redirectOutput(ProcessBuilder.Redirect.INHERIT);

使bash接收与父进程相同的标准输出,这大概是您的终端窗口。这会产生误导性的结果,因为您实际上看到了Docker镜像列表,但是它是由Shell打印的。

如果我将其注释掉,然后遍历结果列表,则可以在JVM中看到Docker的输出。

关于bash - 在Java应用程序中从Docker收集输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41956413/

相关文章:

linux - 查找包含字符串的文件/文件夹并删除但排除字符串被删除

Bash:如何使用局部变量同时捕获错误和回显值?

regex - 使用 sed 搜索和替换文件中的 ip 地址

docker - 如何用docker镜像打包文件

java - 错误: Cannot open VM: "[datastore] myVM1/myVM1.vmx",未知文件后缀

java - 打开一个 shell 并在 java 中与其 I/O 交互

linux - Bash - 如何检查一个文件中的 id 字符串是否在另一个文件的 id 范围策略中?

android - 无法使用Docker执行命令

docker - 使用 docker 日志从 Gitlab CI 获取输出

java - 流程生成器找不到我的文件