停止已运行一段时间的Docker容器

时间:2017-01-21 05:42:58

标签: bash docker

我想创建一个可以阻止Docker容器的cron作业,如果它们的运行时间超过2小时。

我可以得到他们开始的时间。

$ docker inspect -f '{{ .State.StartedAt }}' $(docker ps -q)

只需要将它与2小时前进行比较......

$ date --utc --date="-2 hours" +"%Y-%m-%dT%H:%M:%S.%NZ"

...如果它早点停止容器

$ docker stop <<container_id>>

如何使用bash脚本执行此操作?

3 个答案:

答案 0 :(得分:1)

2013年在issue 1905

中对此进行了讨论

bash替代方案是:

#!/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-run-timeout.sh 10s busybox sh -c 'echo start && sleep 30 && echo finish'
status: timeout
output:
    start

注意,使用泊坞窗1.13,您可以使用--rm -d运行(请参阅PR 20848)。

答案 1 :(得分:1)

这是一个旧主题,但是如果有人正在寻找答案,还是这样。以下命令将停止运行超过2小时的容器。

docker ps --format="{{.RunningFor}} {{.Names}}"  | grep hours |  awk -F: '{if($1>2)print$1}' | awk ' {print $4} ' | xargs docker stop

说明:

docker ps --format="{{.RunningFor}} {{.Names}}" 

将打印容器名称和运行时间。

grep hours 

将打印运行数小时的容器。

 awk -F: '{if($1>2)print$1}' 

仅会打印运行2小时以上的容器。

awk ' {print $4} ' | xargs docker stop

将打印从先前输出获得的容器名称,并将其作为参数传递以停止容器。

答案 2 :(得分:1)

@Siru 的单线很棒,但是我必须更改以下部分才能正确找到超过两位数天数的容器:

awk -F " " '{if($1>14)print$0}'