GoJudge-代码沙箱
大约 3 分钟
GoJudge-代码沙箱
REST API 接口
沙箱服务提供 REST API 接口来在受限制的环境中运行程序(默认监听于 localhost:5050)。
- /run POST 在受限制的环境中运行程序(下面有例子)
- /file GET 得到所有在文件存储中的文件 ID 到原始命名映射
- /file POST 上传一个文件到文件存储,返回一个文件 ID 用于提供给 /run 接口
- /file/:fileId GET 下载文件 ID 指定的文件
- /file/:fileId DELETE 删除文件 ID 指定的文件
- /ws /run 接口的 WebSocket 版
- /stream 运行交互式命令
- /version 得到本程序编译版本和 go 语言运行时版本
- /config 得到本程序部分运行参数,包括沙箱详细参数
命令行参数
服务相关
- 默认监听地址是 localhost:5050,使用 -http-addr 指定
- 默认 gRPC 接口处于关闭状态,使用 -enable-grpc 开启
- 默认 gRPC 监听地址是 localhost:5051 ,使用 -grpc-addr 指定
- 默认日志等级是 info ,使用 -silent 关闭 或 使用 -release 开启 release 级别日志
- 默认没有开启鉴权,使用 -auth-token 指定令牌鉴权
- 默认没有开启 go 语言调试接口(localhost:5052/debug),使用 -enable-debug 开启,同时将日- 志层级设为 Debug
- 默认没有开启 prometheus 监控接口,使用 -enable-metrics 开启 localhost:5052/metrics
- 在启用 go 语言调试接口或者 prometheus 监控接口的情况下,默认监控接口为 localhost:5052,- 使用 -monitor-addr 指定
沙箱相关
- 默认同时运行任务数为和 CPU 数量相同,使用 -parallelism 指定
- 默认文件存储在内存里,使用 -dir 指定本地目录为文件存储
- 默认 cgroup 的前缀为 gojudge ,使用 -cgroup-prefix 指定
- 默认没有磁盘文件复制限制,使用 -src-prefix 限制 copyIn 操作文件目录前缀,使用逗号 , 分隔- (需要绝对路径)(例如:/bin,/usr)
- 默认时间和内存使用检查周期为 100 毫秒(100ms),使用 -time-limit-checker-interval 指定
- 默认最大输出限制为 256MiB,使用 -output-limit 指定
- 默认最大打开文件描述符为 256,使用 -open-file-limit 指定
- 默认最大额外内存使用为 16KiB ,使用 -extra-memory-limit 指定
- 默认最大 copyOut 文件大小为 64MiB ,使用 -copy-out-limit 指定
- 使用 -cpuset 指定 cpuset.cpus (仅 Linux)
- 默认容器用户开始区间为 0(不启用) 使用 -container-cred-start 指定(仅 Linux)
- 举例,默认情况下第 0 个容器使用 10001 作为容器用户。第 1 个容器使用 10002 作为容器用户,- 以此类推
- 使用 -enable-cpu-rate 开启 cpu cgroup 来启用 cpuRate 控制(仅 Linux)
- 使用 -cpu-cfs-period 指定 cfs_period if cpu rate is enabled (default 100ms) (valid - value: [1ms, 1s])
- 使用 -seccomp-conf 指定 seecomp 过滤器(需要编译标志 seccomp,默认不开启)(仅 Linux)
- 使用 -pre-fork 指定启动时创建的容器数量
- 使用 -tmp-fs-param 指定容器内 tmpfs 的挂载参数(仅 Linux)
- 使用 -file-timeout 指定文件存储文件最大时间。超出时间的文件将会删除。(举例 30m)
- 使用 -mount-conf 指定沙箱文件系统挂载细节,详细请参见 mount.yaml (仅 Linux)
- 使用 -container-init-path 指定 cinit 路径 (请不要使用,仅 debug) (仅 Linux)
打包Docker镜像
使用官方镜像
docker run -it --rm --privileged --shm-size=256m -p 5050:5050 --name=go-judge criyle/go-judge
根据二进制文件打包
vim Dockerfile
##########
FROM centos:7
COPY ./Sandbox-amd64-v1.8.0 /usr/local/bin/sandbox
RUN chmod +x /usr/local/bin/sandbox
ENTRYPOINT ["/usr/local/bin/sandbox"]
CMD ["-http-addr=0.0.0.0:5050"]
