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()); } }