本项目提供一个轻量级 Java 代码沙箱服务,支持在 Docker 容器中编译并运行用户代码,按用例输入执行并返回输出结果,适用于在线判题或代码执行类场景。
- 标准输入模式:用户代码通过 stdin 读取输入
- 多用例执行:
inputList支持多组输入,逐条执行并收集输出 - 隔离运行:Docker 容器执行,禁网、只读根文件系统
- 资源限制:内存上限与超时控制
- 临时目录清理:执行结束删除
tmpCode目录
- JDK 8
- Maven
- Spring Boot
- Docker(远程 API 需开启,默认
tcp://localhost:2375)
src/main/java/com/bin/sandbox:核心沙箱逻辑src/main/java/com/bin/sandbox/controller:对外 APIsrc/main/resources/testCode:测试代码样例tmpCode:运行时生成的临时目录(执行结束清理)
- 确保本机 Docker 已开启远程 API(默认
tcp://localhost:2375)。 - 启动服务:
mvn -q -DskipTests spring-boot:run默认端口:8099(见 src/main/resources/application.yml)。
GET /health
返回:ok
POST /executeCode
Header: auth: secretKey
请求体示例:
{
"language": "java",
"code": "import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int a = sc.nextInt(); int b = sc.nextInt(); System.out.println(a + b); } }",
"inputList": ["1 2\n", "3 4\n"]
}响应字段说明:
outputList:每条输入对应的标准输出message:错误信息(若有)status:状态码(约定:1成功,3运行期错误/标准错误输出,2系统异常)judgeInfo:耗时/内存等指标
- 将代码写入
tmpCode/<uuid>/Main.java - 编译得到
Main.class - Docker 容器内运行,按
inputList逐条写入 stdin - 收集 stdout/stderr,聚合到响应
- 删除
tmpCode临时目录
- 单次运行超时:5 秒
- Docker 内存限制:100MB
- RootFS 只读、网络禁用
这是 Docker 客户端与服务端连接异常导致的拉取/执行失败:
- 确认 Docker 远程 API 可用(
tcp://localhost:2375) - 网络不稳定时建议先手动拉取镜像:
docker pull openjdk:8u342-jre-slim-buster - 尝试重启 Docker 服务