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 字节,并禁用您期望的核心文件转储
从写入被迫失败的无限循环中获得。
我正在使用在此 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 字节,并禁用您期望的核心文件转储 从写入被迫失败的无限循环中获得。