发送';执行官';使用Java向Docker容器发送命令

发送';执行官';使用Java向Docker容器发送命令,java,docker,terminal,Java,Docker,Terminal,我正在尝试使用Java运行时发送docker命令。 像docker cp这样的命令与下面的方法配合使用非常好,并且可以直接从终端键入 第一个问题是,docker exec命令只能从终端工作,而不能在Java运行时工作。其他docker命令,如docker cp,按预期工作。唯一的问题是我不能在容器上运行命令,就像在容器的终端上回音一样 第二个问题是下面方法中的System.out.println(…)方法实际上不打印任何内容 private static void runCommand()引发I

我正在尝试使用Java运行时发送docker命令。 像
docker cp
这样的命令与下面的方法配合使用非常好,并且可以直接从终端键入

  • 第一个问题是,
    docker exec
    命令只能从终端工作,而不能在Java运行时工作。其他docker命令,如
    docker cp
    ,按预期工作。唯一的问题是我不能在容器上运行命令,就像在容器的终端上回音一样

  • 第二个问题是下面方法中的
    System.out.println(…)
    方法实际上不打印任何内容

  • private static void runCommand()引发IOException、InterruptedException{
    Process proc=Runtime.getRuntime().exec(
    新字符串[]{“/bin/sh”,
    “-c”,
    “docker exec-u 0-it echo”,“'abc'”});
    缓冲读取器=
    新的BufferedReader(新的InputStreamReader(proc.getInputStream());
    字符串行=”;
    而((line=reader.readLine())!=null){
    系统输出打印(行+“\n”);
    }
    进程waitFor();
    }
    
    无需在shell中运行docker。您可以直接启动该过程。 从Java1.7开始,您还可以使用重定向子流程的标准I/O

    下面是打印
    echo
    命令输出的工作示例:

    ProcessBuilder processBuilder = new ProcessBuilder();
    processBuilder.command("docker", "exec" , "-it", "<CONTAINER_NAME_OR_ID>", "echo", "abc").inheritIO();
    
    try {
      Process process = processBuilder.start();
      BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    
      String line;
      while ((line = reader.readLine()) != null) {
        System.out.println(line);
      }
    
      int exitCode = process.waitFor();
      System.out.println("\nExited with error code : " + exitCode);
    
    } catch (Exception e) {
      e.printStackTrace();
    } 
    
    ProcessBuilder ProcessBuilder=new ProcessBuilder();
    command(“docker”、“exec”、“-it”、“echo”、“abc”).inheritIO();
    试一试{
    Process=processBuilder.start();
    BufferedReader=新的BufferedReader(新的InputStreamReader(process.getInputStream());
    弦线;
    而((line=reader.readLine())!=null){
    系统输出打印项次(行);
    }
    int exitCode=process.waitFor();
    System.out.println(“\n包含错误代码:“+exitCode”);
    }捕获(例外e){
    e、 printStackTrace();
    } 
    

    希望这有帮助。

    这能回答您的问题吗?不幸的是没有。我已经可以发送docker命令了,问题是用'exec'命令发送将在容器内运行的命令。使用API不是更好吗?
    ProcessBuilder processBuilder = new ProcessBuilder();
    processBuilder.command("docker", "exec" , "-it", "<CONTAINER_NAME_OR_ID>", "echo", "abc").inheritIO();
    
    try {
      Process process = processBuilder.start();
      BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    
      String line;
      while ((line = reader.readLine()) != null) {
        System.out.println(line);
      }
    
      int exitCode = process.waitFor();
      System.out.println("\nExited with error code : " + exitCode);
    
    } catch (Exception e) {
      e.printStackTrace();
    }