Judge0在线代码执行系统快速上手:如何用Docker部署90+语言沙箱搭建在线判题 Judge0在线代码执行系统快速上手如何用Docker部署90语言沙箱搭建在线判题【免费下载链接】judge0Robust, fast, scalable, and sandboxed open-source online code execution system for humans and AI.项目地址: https://gitcode.com/GitHub_Trending/ju/judge0当不可信的用户代码需要在你的生产环境里运行时编程学习平台、面试评测系统和 AI 代码校验都会遇到同一个问题。Judge0 是一个开源的在线代码执行系统它把用户代码放进 isolate 沙箱中编译与运行并通过 HTTP JSON API 返回输出、时间、内存等结构化执行结果。Judge0品牌图开源在线代码执行系统视觉形象项目速写一个运行了十年的代码执行引擎Judge0 的定位是给你一个开箱即用的在线代码执行系统让你把运行代码这件事外包给沙箱专心做产品逻辑。它由 Herman Zvonimir Došilović 创建采用 Rails API 层 Resque/Redis 异步队列 PostgreSQL 存储 ioi/isolate 沙箱的模块化架构官方文档中有一篇研究论文专门描述了这套设计。三个硬事实维度事实诞生时间2016 年 8 月持续维护至今语言支持官方宣称 90 种语言仓库语言定义文件中当前活跃 47 条、已归档 42 条维护状态当前版本 1.13.1见 DockerfileGPLv3 许可API 与队列分层社区有完整生产案例典型使用场景都围绕批量执行不可信代码竞赛判题、教学作业自动批改、AI Agent 执行模型生成的代码。⚡ 五分钟跑通第一次执行从提交到拿到结果最短路径只有四步克隆仓库、填两个密码、拉起容器、发一条请求。git clone https://gitcode.com/GitHub_Trending/ju/judge0编辑根目录的 judge0.conf至少补上REDIS_PASSWORD和POSTGRES_PASSWORD两者无默认值执行docker compose up -d等待 server 与 worker 就绪向http://localhost:2358/submissions发 POST 请求最小请求示例language_id 71 对应仓库语言表中的 Python 3.8.1curl -H Content-Type: application/json \ -d {language_id: 71, source_code: print(\hello, \ input()), stdin: Judge0} \ http://localhost:2358/submissions?waittruewaittrue会阻塞到执行完成并直接返回 stdout、status 等字段不加则只返回 token用GET /submissions/:token轮询。官方文档明确不建议在高并发下使用同步模式。执行链路拆解一次提交在沙箱里的完整旅程结论先说一次提交经历入队 → 隔离工作区 → 编译 → 运行 → 校验五个阶段全程由 app/jobs/isolate_job.rb 中的 IsolateJob 驱动沙箱本体是 isolate 命令行。链路细节API 层app/controllers/submissions_controller.rb校验参数、检查队列深度把 Submission 写入 PostgreSQL再投递到 Resque 队列worker 取出任务用isolate -b box_id --init创建独立沙箱工作区把源码、stdin 写入对应文件编译与运行各自生成一个 bash 脚本在沙箱内执行脚本中的 shell 危险字符$;| 等会被剥离结束后 IsolateJob 读取 isolate 产生的 metadata耗时、内存、退出码/信号对照expected_output判定状态最后清理沙箱并可回调 callback_url沙箱隔离至少由三层机制叠加进程与文件系统隔离每个提交使用独立 box 与工作目录HOME/tmp、PATH 收窄到系统目录-d /etc:noexec挂载时禁止执行运行后执行--cleanup销毁资源限制CPU 时间-t默认 5s含超时后额外宽限-x、墙钟时间-w默认 10s、内存-m默认 128MB、栈-k、进程/线程数-p默认 60、可写文件大小-f默认 1MB并支持 cgroups 做总量控制网络控制默认禁止网络仅当提交请求显式enable_networktrue且服务端配置允许时才追加--share-net自托管部署选项Docker Compose 是最短生产路径仓库内置的 docker-compose.yml 定义了四个服务server对外 API端口 2358、worker沙箱执行运行 scripts/workers、dbPostgreSQL 16.2、redis7.2.4开启密码。由于 isolate 依赖 cgroups 与 noexec 挂载server 和 worker 容器需要privileged: true部署时务必放在隔离网络里。因为 server 与 worker 都是无状态进程状态在 Redis 与 PostgreSQL 中扩容只需增加 worker 副本这也是社区将其部署到 Kubernetes 的前提按副本数水平扩展执行能力即可。开发环境可用 docker-compose.dev.yml 与 scripts/dev/ 下的辅助脚本。主配置文件是根目录的 judge0.conf关键项如下配置项默认值作用MAX_QUEUE_SIZE100队列上限超限时新提交返回 503COUNT2 × CPU 核数并行 worker 数决定执行吞吐CPU_TIME_LIMIT/MEMORY_LIMIT5s / 128MB程序级默认资源限制ENABLE_NETWORKfalse沙箱默认禁网总开关AUTHN_TOKEN空不鉴权设置后所有请求需携带鉴权头SUBMISSION_CACHE_DURATION1s结果查询的缓存窗口API 接入实战核心端点、状态码与错误处理核心端点定义在 config/routes.rb 中接入时只需要下表几个端点方法用途/submissionsPOST创建提交可选wait、base64_encoded、fields查询参数/submissions/:tokenGET / DELETE查询结果 / 删除记录删除需开启开关/submissions/batchPOST / GET批量提交与批量查询默认单批 ≤ 20/languages、/statusesGET语言表与状态表/statistics、/system_infoGET用量统计与运行参数/workersGET健康检查提交参数支持逐任务覆盖限制cpu_time_limit、memory_limit、wall_time_limit、number_of_runs多次运行取均值、compiler_options、command_line_arguments、additional_filesBase64 压缩包等。状态码枚举在 app/enumerations/status.rb共 14 个ID状态ID状态1In Queue8Runtime Error (SIGXFSZ)2Processing9Runtime Error (SIGFPE)3Accepted10Runtime Error (SIGABRT)4Wrong Answer11Runtime Error (NZEC)5Time Limit Exceeded12Runtime Error (Other)6Compilation Error13Internal Error7Runtime Error (SIGSEGV)14Exec Format Error常见报错422 表示参数校验失败如language_id不存在503 queue is full 表示队列已满返回cannot be converted to UTF-8错误时改用base64_encodedtrue请求。生产环境加固清单上线前逐项核对设置REDIS_PASSWORD与POSTGRES_PASSWORD不留空默认配置AUTHN_HEADER/AUTHN_TOKEN开启 API 鉴权管理端点再叠加AUTHZ_TOKEN用ALLOW_ORIGIN/ALLOW_IP收紧来源替代默认的全放行按吞吐调整COUNT与MAX_QUEUE_SIZE并为MAX_CPU_TIME_LIMIT、MAX_MEMORY_LIMIT等自定义上限设合理天花板保持ENABLE_NETWORKfalse仅在业务需要时通过ALLOW_ENABLE_NETWORK放开用户侧开关将特权容器放入隔离网络/VPC避免沙箱逃逸影响宿主机监控/workers健康、队列深度、状态分布TLE/CE 占比在网关层做限流兜底发布时切换MAINTENANCE_MODE阻止新提交 避坑指南五个常见现象与修复方式输出乱码或 400 报 UTF-8 转换错误。原因程序输出了非 UTF-8 字节。对策请求与查询统一带base64_encodedtrue客户端解码后再展示。高并发下出现 503 queue is full。原因MAX_QUEUE_SIZE偏小或 worker 处理慢新请求被直接拒绝。对策增加 worker 副本、调大队列上限并对 503 做指数退避重试。同步waittrue在高峰期超时。原因同步模式会让请求线程挂起等待整个执行周期官方文档明确说它扩展性差。对策改为异步提交 callback_url回调或低频轮询 token。编译通过但运行得到 Runtime Error (NZEC)。原因编译产物缺失或运行命令找不到可执行文件退出码为无正常退出。对策检查该语言在 db/languages/active.rb 中的compile_cmd/run_cmd定义查看结果的exit_signal与message字段定位。设置了时间上限程序仍长时间挂起。原因只约束了 CPU 时间而程序在等待 I/O 或 sleep 时不消耗 CPU。对策把WALL_TIME_LIMIT设为更高的兜底值默认 10s官方建议显著高于 CPU 上限。完整端点说明见仓库内 docs/api/docs.md执行与状态判定逻辑可从 app/ 目录逐层阅读。Judge0 适合在线判题、AI 代码校验、教学评测这类批量执行不可信代码的场景如果你的需求是长时间交互式会话或高内存常驻进程则更适合专用容器服务而非本系统的沙箱模型。【免费下载链接】judge0Robust, fast, scalable, and sandboxed open-source online code execution system for humans and AI.项目地址: https://gitcode.com/GitHub_Trending/ju/judge0创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考