【发布时间】:2015-03-21 02:31:18
【问题描述】:
我正在寻求有关此问题的帮助,如果我想对网站中键入的命令的执行进行沙箱处理,我有哪些选择?我想为一种编程语言创建一个在线解释器。
我一直在看 docker,我将如何使用它?这是最好的选择吗?
【问题讨论】:
标签: docker sandbox interpreter
我正在寻求有关此问题的帮助,如果我想对网站中键入的命令的执行进行沙箱处理,我有哪些选择?我想为一种编程语言创建一个在线解释器。
我一直在看 docker,我将如何使用它?这是最好的选择吗?
【问题讨论】:
标签: docker sandbox interpreter
codecube.io 这样做。它是开源的:https://github.com/hmarr/codecube
作者写了他的rationale and process。以下是系统的工作原理:
- 用户在网站上的一个框中键入一些代码,并指定编写代码所用的语言
- 他们点击“运行”,代码被发布到服务器
- 服务器将代码写入临时目录,并启动挂载临时目录的 docker 容器
- 容器运行挂载目录中的代码(具体执行方式因代码语言而异)
- 服务器跟踪运行容器的日志,并通过服务器发送的事件将它们推送到浏览器
- 代码运行结束(或者运行时间过长被杀死),服务器销毁容器
Docker 容器的入口点是entrypoint.sh,它在容器内运行:
prog=$1
<...create user and set permissions...>
sudo -u codecube /bin/bash /run-code.sh $prog
然后run-code.sh检查扩展并运行相关的编译器或解释器:
extension="${prog##*.}"
case "$extension" in
"c")
gcc $prog && ./a.out
;;
"go")
go run $prog
;;
<...cut...>
接受来自 Web 的代码示例并编排 Docker 容器的服务器是用 Go 编写的。事实证明,Go 是一个非常好的选择,因为大部分服务器都依赖于并发(将日志拖到浏览器,等待容器死亡以便进行清理),这让 Go 变得非常简单。
作者还详细介绍了他如何实现资源限制、隔离和安全思想。
【讨论】: