2015-07-13 50 views
1

我正在使用本搬运工issue找到的代码基本上启动一个容器中运行的20秒内的处理,并且如果完成/的过程没有完成 X量杀死在容器中的无限过程/ 未能执行/超时无论容器是否被杀死。多克尔后的时间

我使用目前的代码是这样的:

#!/bin/bash 
set -e 

to=$1 
shift 

cont=$(docker run -d "[email protected]") 
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 

这几乎是完美的。然而,如果你运行一个无限的过程(例如这条巨蟒无限循环):

while True: 
    print "inifinte loop" 

整个系统果酱和应用程序崩溃后,阅读了一下,我认为这与STDOUT缓冲区有关,但我绝对不知道这是什么意思?

回答

0

你的问题是与被写入大量数据到标准输出的过程。 这些消息得到登录到无限增长的文件。 看一看(取决于你的系统的日志文件的位置):

sudo find /var/lib/docker/containers/ -name '*.log' -ls 

可以删除旧的日志文件,如果他们不感兴趣。 一种可能性是在文件的最大大小限制下启动docker run -d守护进程 。 添加到您的脚本开始,例如:

ulimit -f 20000 -c 0 

这限制文件大小为20000个* 1024个字节,并且禁用核心文件转储,您希望 从哪里写被迫失败无限循环得到。

+0

嘿,我不知道在哪里添加上面的代码到我的代码,任何想法? –

+0

在脚本中的'set -e'之后添加'ulimit'。由于docker可能需要将大文件用于除日志以外的其他内容,因此可能需要增加限制。 – meuh

+0

干杯不得不添加到码头虚拟机中运行的脚本,但它的工作方式就像它应该!谢谢 –

0

请在 CONT = $末尾添加&(泊坞窗运行-d “$ @”)&

它会在后台运行的进程。

我不知道,但码头工人若仍无法阻止你还可以在此行之后只添加以下内容:

mypid = $! 睡眠20 & &杀$ mypid

问候

+0

作为后台进程运行使得它变得更糟,而其他线路无法工作,Docker是微型虚拟机,我假设答案将是相当专业化的,但谢谢你的尝试。 –

+0

对不起,是的,它是在后台运行该进程的目的。否则,您将在启动下一条指令之前等待循环完成。我想按退回,但似乎我的垫不能很好地工作。有2个命令:mypid = $! ;然后按回车^^和睡眠20 && kill $ mypid它会杀死你的虚拟机。这可能是更清洁的方式。我会检查我是否可以找到任何文档并发布更好的答案,如果我找到一个 –