容器的Docker超时?

Joe*_*phy 26 python unix bash shell docker

对于我在大学的论文,我正在开发一个编码排行榜系统,用户可以通过临时的docker容器编译/运行不受信任的代码.到目前为止,系统似乎运行良好,但我面临的一个问题是,当提交无限循环的代码时,例如:

while True:
   print "infinite loop"
Run Code Online (Sandbox Code Playgroud)

系统变得混乱.问题是当我创建一个新的docker容器时,Python解释器阻止docker杀死子容器,因为数据仍然被打印到STDOUT(永远).这导致docker占用所有可用系统资源的巨大漏洞,直到使用该系统的机器完全冻结(如下所示):

在此输入图像描述

所以我的问题是,是否有更好的方法在docker容器上设置超时而不是我当前的方法实际上会杀死docker容器并使我的系统安全(代码最初是从这里获取的)?

#!/bin/bash
set -e

to=$1
shift

cont=$(docker run --rm "$@")
code=$(timeout "$to" docker wait "$cont" || true)
docker kill $cont &> /dev/null
echo -n 'status: '
if [ -z "$code" ]; then
    echo timeout
else
    echo exited: $code
fi

echo output:
# pipe to sed simply for pretty nice indentation
docker logs $cont | sed 's/^/\t/'

docker rm $cont &> /dev/null
Run Code Online (Sandbox Code Playgroud)

编辑:我的应用程序中的默认超时(传递给$to变量)是"10s"/ 10秒.


我已经尝试sys.exit()直接添加一个计时器和python源,但这不是一个可行的选项,因为它似乎相当不安全,因为用户可以提交代码以防止它执行,这意味着问题仍然存在.哦被卡在学位论文上的快乐...... :(

Nat*_*rot 3

您可以将容器设置为ulimit最大 CPU 时间,这将终止循环进程。不过,如果恶意用户是容器内的 root 用户,他们就可以绕过这个问题。

还有另一个 SO 问题,“为 Docker 容器设置 CPU 的绝对限制”,描述了如何限制容器的 CPU 消耗。这将使您减少恶意用户的影响。

不过,我同意阿卜杜拉的观点,即你应该能够docker kill逃离你的主管。