使用docker-java执行docker exec touch命令无效果的问题求助
Docker Java执行exec命令无效果问题排查与解决
在主机命令行执行docker exec {container-id} touch asd可以成功在容器内创建文件,但使用docker-java编写代码时,程序无异常抛出,但命令未实际执行:
var exec = dockerClient.execCreateCmd(containerId) .withCmd("touch asd") .exec(); var respo = dockerClient .execStartCmd(exec.getId()) .exec(new ResultCallback.Adapter<>())
问题原因
问题出在withCmd的参数传递逻辑:当你传入单个字符串"touch asd"时,docker-java会将整个字符串当作一个完整的命令去执行,而不是把touch作为命令、asd作为参数。容器内不存在名为touch asd的命令,因此实际没有执行任何有效操作;加上默认的ResultCallback.Adapter会忽略错误输出,导致看起来无异常但命令未生效。
解决方法
将命令和参数分开传递,用字符串数组的形式传入withCmd,同时完善ResultCallback以捕获可能的错误:
var exec = dockerClient.execCreateCmd(containerId) .withCmd("touch", "asd") // 命令与参数拆分传入 .exec(); dockerClient.execStartCmd(exec.getId()) .exec(new ResultCallback.Adapter<Frame>() { @Override public void onNext(Frame frame) { // 打印命令输出,便于调试 System.out.println(new String(frame.getPayload())); } @Override public void onError(Throwable throwable) { // 捕获执行过程中的异常 throwable.printStackTrace(); } });
补充说明
- 命令行的
docker exec会自动拆分空格分隔的命令与参数,但docker-java的withCmd方法不会自动拆分单个字符串参数,必须显式拆分。 - 默认的
ResultCallback.Adapter会忽略所有输出和错误,重写onNext和onError方法可以帮助你排查执行过程中的问题。
内容的提问来源于stack exchange,提问作者de5tro
相关产品推荐
相关产品推荐

