如何在 Docker 容器中从 Java 执行命令?

问题描述 投票:0回答:1

我正在尝试在运行的 Docker 容器中从 Java 执行

chmod
命令:

String cmd = "docker exec -it " + POSTGRES_CONTAINER_NAME + " bash -c 'chmod +x /tmp/dump.sh'";

  Runtime rt = Runtime.getRuntime();
  Process pr = rt.exec(cmd);

  BufferedReader br = new BufferedReader(new InputStreamReader(pr.getInputStream()));
  for (String line = br.readLine(); line != null; line = br.readLine()) {
    LOGGER.debug("L:{}", line);
  }

存在问题,因为未设置执行标志(并且我没有从

docker exec
收到任何消息)。

docker exec -it postgres_intm bash -c "ls -la /tmp/dump.sh"
-rw-r--r-- 1 root root 134 Jun  4 20:59 /tmp/dump.sh

当我从命令行手动调用

chmod
时,执行权限设置正确:

docker exec -it postgres_intm bash -c 'chmod +x /tmp/dump.sh'

docker exec -it postgres_intm bash -c "ls -la /tmp/dump.sh"  
-rwxr-xr-x 1 root root 134 Jun  4 20:59 /tmp/dump.sh

问:我做错了什么,Java代码没有设置执行权限?

java docker macos java-17
1个回答
0
投票

现在我使用@user85421提到的

ProcessBuilder
,因为
exec(String)
容易出错并且已被弃用。使用
ProcessBuilder
,我终于在
process.getErrorStream()
得到了所有错误,问题似乎出在我的
docker exec
选项
-it
中,
-i
意味着“交互式”,所以控制台正在监听另一个输入;当我使用
-t
时,只有命令才能正确执行。

这是最终的

docker exec
代码,可以按预期工作:

 final ProcessBuilder processBuilder = new ProcessBuilder();

      processBuilder.command(
          "docker",
          "exec",
          "-t",
          POSTGRES_CONTAINER_NAME,
          "/bin/bash",
          "-c",
          "pg_dump -U postgres -h localhost -E utf8 --no-acl --no-privileges --no-owner database > /tmp/host/dump.sql");
© www.soinside.com 2019 - 2024. All rights reserved.