You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:47:36