java实现代码沙盒(docker-java)

代码沙盒是一种提供安全、隔离环境来运行代码的工具,本篇实现采用docker-java。

具体思路就是基于特定的镜像将代码包成一个容器,其次就是用docker运行这个容器,运行期间可以获取代码运行的时间、消耗的内存、使用cpu的情况、运行的结果等等信息。

首先引入依赖,要想使用docker-java,必须选择一个transporthttpclient就是其中之一。

这里看全部的transport——docker-java/docs/transports.md at main · docker-java/docker-java

<dependency><groupId>com.github.docker-java</groupId><artifactId>docker-java</artifactId><version>3.3.0</version>
</dependency><dependency><groupId>com.github.docker-java</groupId><artifactId>docker-java-transport-httpclient5</artifactId><version>3.3.0</version>
</dependency><dependency><groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId>
</dependency>

配置DockerClient

DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder().withDockerHost("tcp://127.0.0.1:2375").withDockerTlsVerify(false).withRegistryUsername("").withRegistryPassword("").withRegistryEmail("").withRegistryUrl("https://index.docker.io/v1/").build();
DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder().dockerHost(config.getDockerHost()).sslConfig(config.getSSLConfig()).maxConnections(100).connectionTimeout(Duration.ofSeconds(30)).responseTimeout(Duration.ofSeconds(45)).build();DockerClient dockerClient = DockerClientImpl.getInstance(config, httpClient);

基于Dockerfile构建镜像

BuildImageCmd imageCmd = dockerClient.buildImageCmd(new File("Dockerfile")).withTags(Set.of("my-test-run"));
BuildImageResultCallback buildImageResultCallback = new BuildImageResultCallback();imageCmd.exec(buildImageResultCallback);
String imageId = buildImageResultCallback.awaitImageId();

基于镜像创建容器

CreateContainerResponse response = dockerClient.createContainerCmd(imageId).withHostConfig(HostConfig.newHostConfig().withMemory(1024L * 1024L * 6)// 最大6M.withAutoRemove(true)
).exec();
String containerId = response.getId();

启动容器,并且检查各种状态

long start = System.currentTimeMillis();// 记录开始时间
dockerClient.startContainerCmd(containerId).exec();
dockerClient.statsCmd(containerId).withNoStream(false).exec(new ResultCallback.Adapter<Statistics>() {@Overridepublic void onNext(Statistics statistics) {System.out.println("cpu:" + statistics.getCpuStats().getCpuUsage());System.out.println("内存消耗:" + statistics.getMemoryStats().getUsage() / 1024 / 1024 + "MB");}
});
StringBuilder in = new StringBuilder();
dockerClient.logContainerCmd(containerId).withStdOut(true).withStdErr(true).withFollowStream(true).exec(new ResultCallback<Frame>() {@Overridepublic void onStart(Closeable closeable) {System.out.println("开始");}@Overridepublic void onNext(Frame object) {in.append(new String(object.getPayload()));if (System.currentTimeMillis() - start >= 1000) {// 超时1s超时,结束容器throw new RuntimeException("运行超时");}}@Overridepublic void onError(Throwable throwable) {System.err.println(throwable.getMessage());}@Overridepublic void onComplete() {System.out.println("完毕,删除容器");System.out.println("耗时:" + (System.currentTimeMillis() - start) + "ms");String out = null;try {out = FileUtils.readFileToString(new File("input.out"), StandardCharsets.UTF_8);} catch (IOException e) {throw new RuntimeException(e);}if (!out.endsWith("\n")) {out += "\n";}out = out.replaceAll("\r", "");if (StringUtils.equals(in, out)) {System.out.println("内容一致");} else {System.out.println("内容不一致");}}@Overridepublic void close() throws IOException {System.out.println("关闭");}});
Thread.sleep(10000);

示例👇

这是一个Dockerfile,简单的a+b程序,输入input.in,会打印在控制台输出。

# 选择基础镜像,这里使用官方的Python镜像,以Python 3.9为例
FROM python:3.9# 设置工作目录,后续的操作都将在该目录下进行
WORKDIR /app# 将当前目录下的所有文件(包括Python脚本和可能的依赖配置文件等)复制到容器内的工作目录
COPY . /app# 设置容器启动时要执行的命令,这里是执行你的Python脚本main.py
CMD ["python", "main.py", "input.in"]

目录

-----resources

----------static

---------------input.in

---------------input.out

main.py 以input.in为输入,跑程序,输出到控制台

import systry:with open(f"./static/{sys.argv[1]}", "r") as file:sys.stdin = filefor _ in range(int(input())):a, b = map(int, input().split())print(a + b)except FileNotFoundError:print(f"文件未找到")

通过上面写的监听,将输入和输出进行比较,可以知道运行结果是否和预期一致。

超时会直接结束程序,后续输出不会捕获,也会删除掉容器。

开始
完毕,删除容器
耗时:356ms
内容一致

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/473109.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch学习笔记二:使用Java客户端

一、前言 在上一篇文章中&#xff0c;我们对ES有了最基本的认识&#xff0c;本着实用为主的原则&#xff0c;我们先不学很深的东西&#xff0c;今天打算先学习一下ES的Java客户端如何使用。 二、创建项目 1、普通Maven项目 1、创建一个Maven项目 2、Pom文件 <dependenc…

使用 Grafana api 查询 Datasource 数据

一、使用grafana 的api 接口 官方API 二、生成Api key 点击 Administration -》Users and accss -》Service accounts 进入页面 点击Add service account 创建 service account 点击Add service account token 点击 Generate token , 就可以生成 api key 了 三、进入grafana…

机器学习-36-对ML的思考之机器学习研究的初衷及科学研究的期望

文章目录 1 机器学习最初的样子1.1 知识工程诞生(专家系统)1.2 知识工程高潮期1.3 专家系统的瓶颈(知识获取)1.4 机器学习研究的初衷2 科学研究对机器学习的期望2.1 面向科学研究的机器学习轮廓2.2 机器学习及其应用研讨会2.3 智能信息处理系列研讨会2.4 机器学习对科学研究的重…

深入List集合:ArrayList与LinkedList的底层逻辑与区别

目录 一、前言 二、基本概念 三、相同之处 四、不同之处 五、ArrayList 底层 六、LinkedList 底层 七、ArrayList 应用场景 八、LinkedList 应用场景 九、ArrayList和LinkedList高级话题 十、总结 一、前言 在Java集合的广阔舞台上&#xff0c;ArrayList与LinkedLis…

python实现十进制转换二进制,tkinter界面

目录 需求 效果 代码实现 代码解释 需求 python实现十进制转换二进制 效果 代码实现 import tkinter as tk from tkinter import messageboxdef convert_to_binary():try:# 获取输入框中的十进制数decimal_number int(entry.get())# 转换为二进制binary_number bin(de…

关于强化学习的一份介绍

在这篇文章中&#xff0c;我将介绍与强化学习有关的一些东西&#xff0c;具体包括相关概念、k-摇臂机、强化学习的种类等。 一、基本概念 所谓强化学习就是去学习&#xff1a;做什么才能使得数值化的收益信号最大化。学习者不会被告知应该采取什么动作&#xff0c;而是必须通…

js导入导出

前言: 后面将学习: Vue3ElementPlus 前置知识:前端三件套 HTML,CSS,JS 使用Vscode 本篇学习 这里先补充一个JavaScript的模块化的知识点 - 导入导出 JS提供的导入导出机制,可以实现按需导入. 我们之前是这样导入的 showMessage.js //简单的展示信息 function simpleMessage…

Web导出Excel表格

背景&#xff1a; 1. 后端主导实现 流程&#xff1a;前端调用到导出excel接口 -> 后端返回excel文件流 -> 浏览器会识别并自动下载 场景&#xff1a;大部分场景都有后端来做 2. 前端主导实现 流程&#xff1a;前端获取要导出的数据 -> 常规数据用插件处理成一个e…

【Linux】Ubuntu中muduo库的编译环境安装

Muduo is a multithreaded C network library based on the reactor pattern. muduo库的介绍就是&#xff1a;一个基于reactor反应堆模型的多线程C网络库。 muduo网络库是C语言开发的一个非常优秀的网络库&#xff0c;作者陈硕&#xff0c;muduo网络库在多线程环境下性能非常高…

IDEA leetcode插件代码模板配置,登录闪退解决

前言 最近换电脑&#xff0c;配置idea时和原来的模板格式不一样有点难受&#xff0c;记录一下自己用的模板&#xff0c;后期换电脑使用&#xff0c;大家也可以使用&#xff0c;有更好的地方可以分享给我~ IDEA leetcode插件代码模板配置,登录闪退解决 前言1 下载IDEA leetcode…

网络安全SQL初步注入2

六.报错注入 mysql函数 updatexml(1,xpath语法,0) xpath语法常用concat拼接 例如: concat(07e,(查询语句),07e) select table_name from information_schema.tables limit 0,1 七.宽字节注入(如果后台数据库的编码为GBK) url编码:为了防止提交的数据和url中的一些有特殊意…

【GeekBand】C++设计模式笔记11_Builder_构建器

1. “对象创建” 模式 通过 “对象创建” 模式绕开new&#xff0c;来避免对象创建&#xff08;new&#xff09;过程中所导致的紧耦合&#xff08;依赖具体类&#xff09;&#xff0c;从而支持对象创建的稳定。它是接口抽象之后的第一步工作。典型模式 Factory MethodAbstract …

JS学习日记(jQuery库)

前言 今天先更新jQuery库的介绍&#xff0c;它是一个用来帮助快速开发的工具 介绍 jQuery是一个快速&#xff0c;小型且功能丰富的JavaScript库&#xff0c;jQuery设计宗旨是“write less&#xff0c;do more”&#xff0c;即倡导写更少的代码&#xff0c;做更多的事&#xf…

排序算法(基础)大全

一、排序算法的作用&#xff1a; 排序算法的主要作用是将一组数据按照特定的顺序进行排列&#xff0c;使得数据更加有序和有组织。 1. 查找效率&#xff1a;通过将数据进行排序&#xff0c;可以提高查找算法的效率。在有序的数据中&#xff0c;可以使用更加高效的查找算法&…

动手学深度学习73 课程总结和进阶学习

1. 课程总结和进阶学习 https://c.d2l.ai/stanford-cs329p/ https://paperswithcode.com https://www.bilibili.com/video/BV1nA41157y4/?vd_sourceeb04c9a33e87ceba9c9a2e5f09752ef8 怎么建立知识库 2. QA 20 算法提取的特征和人的不一样&#xff0c;互补 21 很难预测未…

WebRTC视频 04 - 视频采集类 VideoCaptureDS 中篇

WebRTC视频 01 - 视频采集整体架构 WebRTC视频 02 - 视频采集类 VideoCaptureModule WebRTC视频 03 - 视频采集类 VideoCaptureDS 上篇 WebRTC视频 04 - 视频采集类 VideoCaptureDS 中篇&#xff08;本文&#xff09; WebRTC视频 05 - 视频采集类 VideoCaptureDS 下篇 一、前言…

【弱监督视频异常检测】2024-ESWA-基于扩散的弱监督视频异常检测常态预训练

2024-ESWA-Diffusion-based normality pre-training for weakly supervised video anomaly detection 基于扩散的弱监督视频异常检测常态预训练摘要1. 引言2. 相关工作3. 方法论3.1. 使用扩散自动编码器进行常态学习3.2. 全局-局部特征编码器3.2.1 局部块3.2.2 全局块3.2.3 协同…

ONLYOFFICE8.2版本测评,团队协作的办公软件

文章目录 引言ONLYOFFICE产品简介功能与特点1. 实时协作2. 兼容性3. 模板库4. 评论和修订5. 安全性 体验与测评功能测试 邀请用户使用项目介绍结尾了解更多 引言 在数字化办公的浪潮中&#xff0c;效率和协作成为了工作的核心。ONLYOFFICE作为一个强大的办公套件&#xff0c;正…

Day18 Nim游戏

你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a; 桌子上有一堆石头。 你们轮流进行自己的回合&#xff0c; 你作为先手 。 每一回合&#xff0c;轮到的人拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。 假设你们每一步都是最优解。请编写一个函数&#xff…

【论文复现】STM32设计的物联网智能鱼缸

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀STM32设计的物联网智能鱼缸 【1】项目功能介绍【2】设计需求总结【3】项目硬件模块组成 1.2 设计思路【1】整体设计思路【2】ESP8266工作模式…