Отправка команд 'exe c' в контейнер Docker с использованием Java - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь отправить docker команды, используя Java Runtime. Такие команды, как docker cp, очень хорошо работают с описанным ниже методом, а также вводят текст непосредственно с терминала.

  1. Первая проблема заключается в том, что команда docker exec работает только с терминала, а не с Java Runtime. Другие docker команды, такие как docker cp, работают как положено. Единственная проблема заключается в том, что я не могу запускать команды для контейнера, такие как отображение на терминале контейнера.

  2. Также 2-ая проблема заключается в том, что метод System.out.println(...) в методе ниже, на самом деле ничего не печатает.

private static void runCommand() throws IOException, InterruptedException {
        Process proc = Runtime.getRuntime().exec(
                new String[]{"/bin/sh",
                        "-c",
                        "docker exec -u 0 -it <CONTAINER_NAME> echo",  "'abc'"});
        BufferedReader reader =
                new BufferedReader(new InputStreamReader(proc.getInputStream()));
        String line = "";
        while ((line = reader.readLine()) != null) {
            System.out.print(line + "\n");
        }
        proc.waitFor();
}

1 Ответ

0 голосов
/ 21 января 2020

Нет необходимости запускать docker внутри оболочки. Вы можете начать процесс напрямую. Начиная с Java 1.7, вы также можете использовать ProcessBuilder.inheritIO () для перенаправления стандартного ввода-вывода подпроцесса

Ниже рабочего примера, который печатает выходные данные 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();
} 

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...