用 Docker 四步跑起 Judge0 在线代码执行沙箱:从 API 调用到生产配置

📅 2026/8/24 3:20:59
用 Docker 四步跑起 Judge0 在线代码执行沙箱:从 API 调用到生产配置
用 Docker 四步跑起 Judge0 在线代码执行沙箱从 API 调用到生产配置【免费下载链接】judge0Robust, fast, scalable, and sandboxed open-source online code execution system for humans and AI.项目地址: https://gitcode.com/GitHub_Trending/ju/judge0如果你在做在线判题、编程面试工具或 AI 编程助手迟早会碰到同一个问题怎样安全地运行别人写来的代码。Judge0 是一个开源的在线代码执行系统2016 年 8 月立项采用 GPL v3 许可把程序的编译与执行关进沙箱一种隔离环境程序跑在里面碰不到宿主机对外只暴露一个 HTTP JSON API官方口径支持 90 多种语言。这篇文章按判断需求 → 本地跑通 → 调用 API → 理解隔离 → 上生产的顺序走一遍。 什么需求下该自建代码执行沙箱判题与教学平台自动判分做 LeetCode 式的练习平台时每道题都需要运行学生代码 → 对比标准输出 → 给出状态这一步。自己用 shell 直接跑学生代码一次构造脚本就能拖垮服务器把执行环节外包给 Judge0你只需要保存题目和期望输出判分逻辑由执行结果驱动。面试工具实时验证候选人代码招聘平台让候选人在浏览器里写代码、当场看运行结果。对候选人而言这是秒级反馈对平台而言这是在不可信环境中跑任意代码——这正是 Judge0 的设计目标执行不可信代码而不危及主机。AI 助手运行模型生成的代码大模型生成的代码在交给用户之前通常要跑一遍验证正确性。Judge0 支持多文件项目、附加文件和自定义编译参数AI 编程工具链里普遍把它当作代码执行后端后续新增语言支持也不影响调用方。当前仓库 CE 分支的活跃语言清单定义在 db/languages/active.rb共 47 种语言每种语言用一段 Ruby 结构描述源文件后缀 编译命令 运行命令需要扩展时改这一个文件即可。 用 Docker Compose 四步跑起 Judge0第一步克隆仓库仓库根目录就是部署所需的全部材料docker-compose.yml描述四个容器judge0.conf是唯一的配置文件。第二步补齐必填密码打开 judge0.conf必须设置REDIS_PASSWORD和POSTGRES_PASSWORD注释里明确写了 MUST BE SET其余项都有默认值。默认值里值得先知道几个CPU_TIME_LIMIT5默认单次运行 CPU 时间上限 5 秒、MAX_QUEUE_SIZE100队列最多排队 100 个提交。第三步一条命令启动四个容器git clone https://gitcode.com/GitHub_Trending/ju/judge0 cd judge0 docker compose up -dDocker Compose 是一个按 YAML 描述同时拉起多个容器的工具。这里会启动 4 个服务API 服务器映射端口 2358、执行 worker、Postgres 16.2存提交记录、Redis 7.2存任务队列。server 和 worker 都设置了privileged: true因为沙箱隔离需要内核级权限部署环境必须允许特权容器。第四步确认服务就绪请求GET /health应返回正常状态再请求GET /workers返回每个队列的size排队数、available、idle、working等字段能看到 worker 已挂上来。 提交一段代码并读取执行结果waittrue 同步等待与异步轮询的区别创建提交时默认行为是POST 成功后返回一个 token之后用GET /submissions/{token}查询状态轮询即每隔几秒问一次结果。加上waittrue查询参数则本次请求直接阻塞到执行完成并返回完整结果本地调试更省事。但官方文档明确提示waittrue扩展性差、不建议生产使用且该功能由ENABLE_WAIT_RESULT开关控制默认开启。批量提交一次带上 20 个任务一次判 20 道题、一次跑 10 组测试用例时用POST /submissions/batch可以在一个请求里提交多个提交返回一组 token。单批上限由MAX_SUBMISSION_BATCH_SIZE控制默认 20能显著减少网络往返开销。14 种状态码对应什么结果执行结果里的status.id从 1 到 141 排队中、2 处理中3 为 Accepted4 为 Wrong Answer5 为超时6 为编译错误7 到 12 是各类运行时错误段错误、文件大小超限、浮点异常等13 是内部错误。完整定义见 app/enumerations/status.rb。所有请求参数、字段和错误响应的细节以 docs/api/docs.md 为准。最小可运行的调用示例language_id 109 为 Python可在语言清单中查其他语言curl -H Content-Type: application/json \ -d {language_id: 109, source_code: print(input()), stdin: Alice} \ http://localhost:2358/submissions?waittrue返回体包含stdout、stderr、time、memory和status判分平台通常只关心status.id和stdout。️ 沙箱对不可信代码设了哪些限制⏱️ 进程与资源CPU、内存、文件都有上限Judge0 的隔离层是 isolateIOI 出品的命令行沙箱工具。每次提交都在 isolate 内编译和运行默认 CPU 时间 5 秒用户自定义最高 15 秒墙钟时间 10 秒防睡死的程序地址空间 128000KB约 125MB上限可配到 512MB进程/线程数不超过 60 个程序可写文件不超过 1MB。还可以用NUMBER_OF_RUNS让程序跑多次取时间和内存的平均值最高 20 次。默认断网按次放行ENABLE_NETWORK默认为 false程序默认无法发起网络调用调用方可以按提交传enable_network单独放行前提是服务端ALLOW_ENABLE_NETWORK为 true。对外网开放执行环境前这条默认值值得保留。队列满了就拒绝而不是堆积worker 以固定数量并行消费队列默认COUNT2×nproc。当排队数达到MAX_QUEUE_SIZE默认 100新的创建请求直接返回 503queue is full调用方需要自行决定重试或提示用户服务端不会无限堆积任务拖慢整体。⚙️ 上生产前必须改的 judge0.conf给 API 加认证和授权默认情况下接口完全敞开AUTHN_TOKEN为空即关闭认证。生产环境应设置AUTHN_HEADERAUTHN_TOKEN每个请求都要带这对 token删除提交等受保护接口还需额外配置AUTHZ_HEADERAUTHZ_TOKEN。回调webhook默认开启执行完成后可推送到你指定的callback_url重试 3 次。用白名单限制访问来源ALLOW_ORIGIN/DISALLOW_ORIGIN控制浏览器跨域来源ALLOW_IP/DISALLOW_IP控制请求 IP均为空格分隔的列表留空表示不限制。自建服务挂在内网或代理后面时把这两组都收紧。监控、缓存与维护模式把GET /workers接入你的监控队列size持续偏高、failed非零时告警。注意遥测默认开启JUDGE0_TELEMETRY_ENABLE不想要就显式设为 false提交结果默认缓存 1 秒SUBMISSION_CACHE_DURATION相同输入短时间内的重复提交直接命中缓存。计划停机维护时打开MAINTENANCE_MODE客户端的创建请求会收到你自定义的维护提示。Judge0 在线代码执行沙箱品牌壁纸接下来往下挖的入口接口字段与错误码在 docs/api/docs.md提交请求的处理逻辑在 app/controllers/submissions_controller.rb真正进入沙箱执行的是 app/jobs/isolate_job.rb。【免费下载链接】judge0Robust, fast, scalable, and sandboxed open-source online code execution system for humans and AI.项目地址: https://gitcode.com/GitHub_Trending/ju/judge0创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考