跳至主要內容

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"]
上次编辑于:
贡献者: 李元昊,liyuanhao