当前位置: 首页 > wzjs >正文

网站制作 广州北京今日重大新闻

网站制作 广州,北京今日重大新闻,便宜网站建设价格,wordpress播放器修改基于docker-java封装的工具类 背景环境工具类 背景 写OJ系统时需要用docker作为代码沙箱使用,顺手封装了一个工具类,给自己做个笔记,如果可以的话也希望帮助到其他人。 环境 docker 26.1.4docker-java 3.4.2docker-java-transport-httpcli…

基于docker-java封装的工具类

  • 背景
  • 环境
  • 工具类

背景

写OJ系统时需要用docker作为代码沙箱使用,顺手封装了一个工具类,给自己做个笔记,如果可以的话也希望帮助到其他人。

环境

  • docker 26.1.4
  • docker-java 3.4.2
  • docker-java-transport-httpclient5 3.4.2

工具类


import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.async.ResultCallback;
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.api.command.PullImageResultCallback;
import com.github.dockerjava.api.model.Frame;
import com.github.dockerjava.api.model.Image;
import com.github.dockerjava.api.model.PullResponseItem;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ObjectUtils;import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;/*** @author * @Description dockerClient工具类* @create 2025-04-19 0:30*/
@Slf4j
public class DockerClientUtil {/*** 获取镜像* @return*/public static void getImage(DockerClient dockerClient, String imageName, String imageTag) throws InterruptedException {// 判断镜像是否存在imageTag = ObjectUtils.isEmpty(imageTag)? "latest" : imageTag;// 获取所有本地镜像List<Image> images = dockerClient.listImagesCmd().exec();// 构造完整镜像名String fullImageName = imageName + ":" + imageTag;// 假设镜像不辞你在boolean isImageExists = false;// 遍历镜像列表,检查是否存在匹配的镜像for (Image image : images) {if (image.getRepoTags() != null) {// 确保 RepoTags 不为空for (String repoTag : image.getRepoTags()) {if (repoTag.equals(fullImageName)) {// 存在isImageExists = true;break;}}}}if (!isImageExists) {System.out.println("拉取镜像");// 不存在,拉取镜像dockerClient.pullImageCmd(fullImageName).exec(new PullImageResultCallback() {@Overridepublic void onNext(PullResponseItem item) {super.onNext(item);}}).awaitCompletion();}}/*** 创建可交互控制台容器*/public static CreateContainerResponse createContainer(DockerClient dockerClient, String imageName, String imageTag) {return dockerClient.createContainerCmd(String.format("%s:%s", imageName, imageTag))// 启用伪终端.withTty(true)// 保持标准输入打开.withStdinOpen(true)// 附加标准输入.withAttachStdin(true)// 附加标准输出.withAttachStdout(true)// 附加标准错误.withAttachStderr(true)// 使用登录 shell.withCmd("sh", "-l").exec();}/*** 字符串作为文件保存到容器* @param dockerClient docker客户端* @param containerId 容器id* @param filePath 文件目标路径* @param fileContent 文件内容* @return 是否保存成功* @throws InterruptedException*/public static boolean saveFileToContainer(DockerClient dockerClient, String containerId, String filePath, String fileContent) throws InterruptedException {// 准备编译命令String command = String.format("mkdir -p %s && printf \"%s\" > %s",filePath.replaceAll("([^/]+)/[^/]*$", "$1"), fileContent.replace("\"", "\\\""), filePath);// 创建exec配置String execId = dockerClient.execCreateCmd(containerId).withAttachStdout(true).withAttachStderr(true)// 通过sh -c执行.withCmd("sh", "-c", command).exec().getId();AtomicBoolean rs = new AtomicBoolean(true);// 执行并获取输出dockerClient.execStartCmd(execId).exec(new ResultCallback.Adapter<Frame>() {@Overridepublic void onNext(Frame object) {rs.set(ObjectUtils.isEmpty(object.getPayload()));if (!ObjectUtils.isEmpty(object.getPayload())) {rs.set(false);}super.onNext(object);}}).awaitCompletion();return rs.get();}/*** 运行命令* @param dockerClient* @param containerId* @param command* @return* @throws InterruptedException*/public static String runCommand(DockerClient dockerClient, String containerId, String command) throws InterruptedException {// 创建exec配置String execId = dockerClient.execCreateCmd(containerId).withAttachStdout(true).withAttachStderr(true)// 通过sh -c执行.withCmd("sh", "-c", command).exec().getId();StringBuilder rs = new StringBuilder();// 执行并获取输出dockerClient.execStartCmd(execId).exec(new ResultCallback.Adapter<Frame>() {@Overridepublic void onNext(Frame object) {rs.append(new String(object.getPayload()));super.onNext(object);}}).awaitCompletion();return rs.toString();}/*** 运行代码并批量输入* @param dockerClient* @param containerId* @param runCommand* @param inputStr* @return 运行结果* @throws InterruptedException*/public static String runCommandWithInputBatch(DockerClient dockerClient, String containerId, String runCommand, String inputStr) throws InterruptedException {return runCommand(dockerClient, containerId, String.format("echo -e \"%s\" | %s", inputStr.trim().replaceAll(" ", "\n").replaceAll("\"", "\\\""), runCommand)).replaceAll("\\n$", "");}/*** 清理容器* @param dockerClient* @param containerId*/public static void destroyContainer(DockerClient dockerClient, String containerId) throws InterruptedException {// 停止容器dockerClient.stopContainerCmd(containerId).exec();// 删除容器dockerClient.removeContainerCmd(containerId).exec();}
}
http://www.dtcms.com/wzjs/149014.html

相关文章:

  • 永久免费企业建站官网大全seo还能赚钱吗
  • 天津建设集团网站站长工具ip查询
  • 郑州网络营销公司排名内蒙古网站seo
  • 什么网站能免费做推广百度如何做推广
  • 哪些网站做免费送东西的广告6成都网站制作关键词推广排名
  • 企业网站建设移动com天堂网
  • 外贸网站建设网站天津seo排名收费
  • liferay做网站好吗培训方案及培训计划
  • 网站注册协议公司网站建设流程
  • 大麦网的网站建设如何快速推广app
  • 生日祝福网页源码html广州做seo的公司
  • 湖北省建设安全管理协会网站天眼查询个人
  • 做网站全屏尺寸是多少钱打开官方网站
  • 竞价sem托管公司博客seo教程
  • 西双版纳建设厅网站快手seo
  • 免费自制网站建设网站维护公司
  • 网站建设查询软文营销策划方案
  • 北京房产信息网官网网络关键词优化方法
  • 做小说网站做国外域名还是国内的好处故事式软文范例500字
  • 我国政府门户网站建设的原则网站手机优化
  • 模板网站建设源码网站seo收费
  • 网站作品集网络服务合同
  • 网站制作网站开发开一个网站需要多少钱
  • 网站后台发布了但看不见网页推广方案
  • 学校网站建设的优势和不足google官网进入
  • 自动发布到wordpressseocui cn
  • 深圳网站建设民治大道负面口碑营销案例
  • wordpress旅游类网站优化方案电子版
  • 怎样做淘宝客导购网站百度网站推广怎么收费
  • 国外域名的网站蚂蚁bt