项目链接: https://github.com/Myriad-Dreamin/core-oj/tree/develop
思路:
- 将worker分为两种, compiler & judger
- compiler负责隔离编译环境,设置编译资源限制,权限限制
- judger负责隔离运行环境,sandboxize
- 设计结构体管理compilers/judgers
- gin-server只是作为core的测试服务器,可以利用compiler/judger的daemon自行编写服务
compiler
- daemon与compilers之间用grpc通信。
- compiler的资源受到daemon管理,当compiler超时无反应时,直接摧毁compiler重建一个新的compiler,并向上级报告严重错误
- compiler的language config可自定义,暴露的接口可以定义新的编译类型。
judger
- 隔绝所有网络环境。
- daemon与judgers之间用unix-socket通信。
- 资源限制与judger类似。
- 使用docker的用户映射,docker根用户root为物理机普通用户,除了共享容器的完全访问权限,没有其他任何权限。judger开辟子进程运行程序时,改变其uid-gid为运行时用户worker。worker只有目标程序的100权限,没有judger以及物理机其他的任何权限。
docker configuration
- 采用alpine最小镜像</