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

我正在使用在这个docker问题find的代码基本上启动一个容器在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有关,但我完全不知道这意味着什么?

你所遇到的问题是一个写入海量数据到stdout的进程。 这些消息被logging到无限增长的文件中 。 看看(取决于你的系统的日志文件的位置):

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

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

 ulimit -f 20000 -c 0 

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

请在cont = $(docker run -d“$ @”)结尾添加&

它将在后台运行该进程。

我不知道docker工人,但是如果还没有停下来,你也可以在这一行之后加上以下内容:

mypid = $! 睡20 && kill $ mypid

问候

Interesting Posts