我正在尝试在运行的 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代码没有设置执行权限?
现在我使用@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");