package com.miniframe.tools.docker;
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.async.ResultCallback;
import com.github.dockerjava.api.command.*;
import com.github.dockerjava.api.model.Frame;
import com.github.dockerjava.api.model.HostConfig;
import com.github.dockerjava.api.model.Mount;
import com.github.dockerjava.api.model.MountType;
import com.github.dockerjava.core.DefaultDockerClientConfig;
import com.github.dockerjava.core.DockerClientBuilder;
import com.github.dockerjava.core.DockerClientConfig;
import com.github.dockerjava.httpclient5.ApacheDockerHttpClient;
import com.github.dockerjava.transport.DockerHttpClient;
import com.miniframe.model.system.SysFile;
import com.miniframe.tools.XIFileUtils;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
public class DockerExe {
// public static String DOCKERHOST="tcp://127.0.0.1:2375/";
// public static String APIVERSION="26.1.0";
public static final String DOCKERHOST="tcp://192.168.0.132:2375/";
public static final String APIVERSION="1.13.1";
// 获取容器信息
public static String getDocker(String pid){
DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
.withDockerHost(DOCKERHOST) // 设置 Docker 主机地址
.withDockerTlsVerify(false) // 启用 TLS 验证
.withApiVersion(APIVERSION) // 设置 API 版本
.build();
DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
.dockerHost(config.getDockerHost())
.sslConfig(config.getSSLConfig())
.build();
DockerClient dockerClient = DockerClientBuilder.getInstance(config)
.withDockerHttpClient(httpClient)
.build();
InspectContainerResponse containerInfo = dockerClient.inspectContainerCmd(pid).exec();
//exited 停止 running 运行
try{
return containerInfo.getState().getStatus();
}catch (Exception e){
return "No such container:"+pid;
}
}
public static void stopDocker(String pid){
DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
.withDockerHost(DOCKERHOST) // 设置 Docker 主机地址
.withDockerTlsVerify(false) // 启用 TLS 验证
.withApiVersion(APIVERSION) // 设置 API 版本
.build();
DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
.dockerHost(config.getDockerHost())
.sslConfig(config.getSSLConfig())
.build();
DockerClient dockerClient = DockerClientBuilder.getInstance(config)
.withDockerHttpClient(httpClient)
.build();
try {
RemoveContainerCmd removeContainerCmd = dockerClient.removeContainerCmd(pid)
.withForce(true);
removeContainerCmd.exec();
System.out.println("容器已停止: " + pid);
} catch (Exception e) {
System.err.println("停止容器失败: " + e.getMessage());
// e.printStackTrace();
}
}
public static void getDockerLogs(String pid, ResultCallback.Adapter logsexe) throws InterruptedException {
DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
.withDockerHost(DOCKERHOST) // 设置 Docker 主机地址
.withDockerTlsVerify(false) // 启用 TLS 验证
.withApiVersion(APIVERSION) // 设置 API 版本
.build();
DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
.dockerHost(config.getDockerHost())
.sslConfig(config.getSSLConfig())
.build();
DockerClient dockerClient = DockerClientBuilder.getInstance(config)
.withDockerHttpClient(httpClient)
.build();
// 获取容器日志
LogContainerCmd logContainerCmd = dockerClient.logContainerCmd(pid)
.withStdOut(true)
.withStdErr(true)
.withFollowStream(true);
// 使用 ResultCallback.Adapter 处理日志
logContainerCmd.exec(logsexe).awaitCompletion();
}
public static void run(String pid,Integer type) {
DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
.withDockerHost(DOCKERHOST) // 设置 Docker 主机地址
.withDockerTlsVerify(false) // 启用 TLS 验证
.withApiVersion(APIVERSION) // 设置 API 版本
.build();
DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
.dockerHost(config.getDockerHost())
.sslConfig(config.getSSLConfig())
.build();
DockerClient dockerClient = DockerClientBuilder.getInstance(config)
.withDockerHttpClient(httpClient)
.build();
Mount wokerMount = new Mount()
.withType(MountType.BIND)
.withSource("/cephfs/ac/"+pid)
.withTarget("/cephfs/ac/"+pid)
.withReadOnly(false);
List am =new ArrayList<>();
am.add(wokerMount);
//创建容器
CreateContainerResponse container = dockerClient
.createContainerCmd("aircraft:1.0")//镜像名称
.withName(pid)//容器名称
.withHostConfig(
HostConfig.newHostConfig()
.withMounts(am)
).withCmd("bash", "-c", "cd /home/aircraft/project " +
"&& export PYTHONPATH=$PYTHONPATH:/home/aircraft/Soad_Project " +
"&& source ~/miniconda3/etc/profile.d/conda.sh " +
"&& conda activate " +
"&& python test.py gui.xml /cephfs/ac/"+pid+"/"+type+
" && conda deactivate")
.exec();
dockerClient.startContainerCmd(container.getId()).exec();
System.out.println("容器启动成功,ID: " + container.getId());
}
}