【问题标题】:Sandbox command execution with docker via Ajax通过 Ajax 使用 docker 执行沙箱命令
【发布时间】:2015-03-21 02:31:18
【问题描述】:

我正在寻求有关此问题的帮助,如果我想对网站中键入的命令的执行进行沙箱处理,我有哪些选择?我想为一种编程语言创建一个在线解释器。

我一直在看 docker,我将如何使用它?这是最好的选择吗?

【问题讨论】:

    标签: docker sandbox interpreter


    【解决方案1】:

    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 变得非常简单。

    作者还详细介绍了他如何实现资源限制、隔离和安全思想。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多