我正在使用此泊坞窗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 有关但我完全不知道这意味着什么?
答案 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字节,并禁用您期望的核心文件转储 从无限循环中获取写入被强制失败。