Docker在X时间后杀死容器中的无限进程

时间:2015-07-13 05:07:51

标签: bash shell docker infinite-loop infinite

我正在使用此泊坞窗issue中的代码基本上启动容器在20秒内运行流程,如果流程完成 / 未完成 / 无法执行 / 超时无论如何都会杀死容器。

我目前使用的代码是:

#!/bin/bash
set -e

to=$1
shift

cont=$(docker run -d "$@")
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

这几乎是完美的但是如果你运行一个无限的过程(例如这个python无限循环):

while True:
    print "inifinte loop"

整个系统都崩溃了,应用程序崩溃了,经过阅读后我觉得它与 STDOUT Buffer 有关但我完全不知道这意味着什么?

2 个答案:

答案 0 :(得分:0)

请添加&在......的最后 cont = $(docker run -d" $ @")&

它将在后台运行该过程。

我不知道码头工人,但如果它仍然无法停止,您也可以在此行之后添加以下内容:

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

问候

答案 1 :(得分:0)

您遇到的问题是将大量数据写入stdout的进程。 这些消息登录到无限增长的文件。 看一下(取决于系统的日志文件位置):

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

如果没有兴趣,可以删除旧的日志文件。 一种可能性是启动docker run -d守护进程 根据对文件最大大小的ulimit限制。 添加到脚本的开头,例如:

ulimit -f 20000 -c 0

这会将文件大小限制为20000 * 1024字节,并禁用您期望的核心文件转储 从无限循环中获取写入被强制失败。