Docker 在 X 时间后终止容器中的无限进程

Docker kill an infinite process in a container after X amount of time

我正在使用在此 docker issue 中找到的代码基本上在 20 秒内启动一个容器 运行 一个进程,如果进程 完成 / 未完成 / 执行失败 / 超时 不管怎样,容器被杀死。

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

#!/bin/bash
set -e

to=
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 缓冲区有关,但我完全不知道那是什么意思?

请在末尾加上& 续=$(docker 运行 -d "$@")&

它将运行后台进程。

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

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

此致

您遇到的问题是将大量数据写入标准输出的进程。 这些消息 被记录到一个无限增长的文件中 。 查看(取决于您系统的日志文件位置):

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

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

ulimit -f 20000 -c 0

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