我正在撰写大学的论文,涉及编程排行榜系统,用户可以通过临时的docker容器编译/运行不受信任的代码。目前看来系统运行良好,但我面临的一个问题是,当提交无限循环的代码时,例如:
while True:
print "infinite loop"
系统失控了。问题在于,当我创建一个新的docker容器时,Python解释器会阻止docker杀死子容器,因为数据仍然被打印到STDOUT(永远)。这导致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
编辑:我的应用程序中默认的超时时间(传递给$to
变量)为“10s” / 10秒。
我尝试过直接在Python源代码中添加计时器和
sys.exit()
,但这并不是一个可行的选择,因为它似乎相当不安全,因为用户可以提交代码以防止其执行,这意味着问题仍然存在。哦,被卡在论文上的快乐... :(
ID=$(docker run -d unsecure) && docker run --rm cleanup $ID
,其中cleanup是一个容器,在X秒后杀死另一个容器? - Abdullah Jibaly