如何使用Java在Docker容器中执行docker exec命令
在Java中实现Docker容器内执行带参数脚本的方案
嘿,刚好能帮你解决这个问题!你在终端里用docker exec pps-control /bin/sh -c "./build/doControlStuff.sh 123456"执行容器内带参脚本的需求,用Java实现其实有两种常用方案,刚好你提到了Palantir的库,我给你详细拆解下:
方案一:用Palantir Docker Compose库(适合Compose管理的容器)
如果你是用Docker Compose来管理pps-control容器的,这个库用起来特别顺手,代码简洁还能帮你管理容器生命周期:
1. 先加Maven依赖
把这段依赖放到你的pom.xml里,版本可以选最新的稳定版:
<dependency> <groupId>com.palantir.docker-compose</groupId> <artifactId>docker-compose-rule</artifactId> <version>0.35.0</version> <scope>test</scope> <!-- 如果是业务代码里用,就去掉这个scope --> </dependency>
2. 实现代码示例
package com.mypackage; import com.palantir.docker-compose.DockerComposeRule; import com.palantir.docker-compose.connection.Container; import static com.palantir.docker.compose.execution.DockerComposeExecArgument.arguments; public class DockerComposeExecDemo { public static void main(String[] args) { // 这里指定你的docker-compose.yml路径,默认是项目根目录 try (DockerComposeRule dockerCompose = DockerComposeRule.builder() .file("docker-compose.yml") .build()) { // 拿到你要操作的pps-control容器实例 Container targetContainer = dockerCompose.container("pps-control"); // 执行和终端完全对应的命令,arguments里的参数就是终端命令拆分后的各个部分 String scriptOutput = targetContainer.exec( arguments("/bin/sh", "-c", "./build/doControlStuff.sh 123456") ).stdout(); // 打印脚本执行的结果 System.out.println("脚本执行输出:\n" + scriptOutput); } catch (Exception e) { e.printStackTrace(); } } }
方案二:用Docker Java Client(通用所有容器)
如果你的pps-control容器是单独启动的,不是用Compose管理的,那这个通用方案更合适,直接和Docker daemon交互:
1. 添加Maven依赖
<dependency> <groupId>com.github.docker-java</groupId> <artifactId>docker-java</artifactId> <version>3.3.4</version> <!-- 可以换成最新稳定版 --> </dependency>
2. 实现代码示例
package com.mypackage; import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.ExecCreateCmdResponse; import com.github.dockerjava.core.DockerClientBuilder; import com.github.dockerjava.core.command.ExecStartResultCallback; import java.io.ByteArrayOutputStream; import java.io.IOException; public class DockerDirectExecDemo { public static void main(String[] args) throws InterruptedException, IOException { // 创建Docker客户端,默认会读取本地Docker的配置(比如~/.docker目录下的) DockerClient dockerClient = DockerClientBuilder.getInstance().build(); // 把终端的命令拆成参数数组,和你终端里的命令完全对应 String[] execCmd = {"/bin/sh", "-c", "./build/doControlStuff.sh 123456"}; // 先创建执行指令,指定容器名,设置要捕获标准输出和错误输出 ExecCreateCmdResponse execResponse = dockerClient.execCreateCmd("pps-control") .withCmd(execCmd) .withAttachStdout(true) .withAttachStderr(true) .exec(); // 准备流来捕获输出内容 ByteArrayOutputStream stdout = new ByteArrayOutputStream(); ByteArrayOutputStream stderr = new ByteArrayOutputStream(); // 执行命令并等待完成,同时把输出写到对应的流里 dockerClient.execStartCmd(execResponse.getId()) .exec(new ExecStartResultCallback(stdout, stderr)) .awaitCompletion(); // 打印结果 System.out.println("脚本执行标准输出:\n" + stdout.toString()); System.err.println("脚本执行错误输出:\n" + stderr.toString()); // 记得关闭客户端 dockerClient.close(); } }
内容的提问来源于stack exchange,提问作者Saffik
相关产品推荐
相关产品推荐

