查找并杀死所有超过 1 天的 docker 实例

use*_*466 4 linux docker

我需要运行一个命令

 docker ps -a 
Run Code Online (Sandbox Code Playgroud)

上面写着:

id    name   time
1      abc    6 weeks ago
Run Code Online (Sandbox Code Playgroud)

要杀死我们需要启动命令:

docker kill id
Run Code Online (Sandbox Code Playgroud)

我需要找到所有 id 并在每个 1 天之前的 id 上运行 kill 命令。我怎样才能做到这一点?

max*_*zig 10

一些 docker 命令提供了使用 go 模板调整输出格式的可能性。因此,我们可以使用该机制来获取更易于处理的正在运行的容器的启动时间。

例如:

docker ps --format='{{.ID}}' \
  | xargs -n 1 -r docker inspect \
                           -f '{{.ID}} {{.State.Running}} {{.State.StartedAt}}' \
  | awk '$2 == "true" && $3 <= "'$(date -d 'yesterday' -Ins --utc \
                                     | sed 's/+0000/Z/')'" { print $1 }' \
  | xargs -r docker kill
Run Code Online (Sandbox Code Playgroud)

我们xargs在这里假设 GNU - 该-r选项指示xargs只有在至少有一个参数时才执行命令。我们还依赖于 GNU date- 目标是获取昨天的日期 + 时间 - 带有 Zulu 时间后缀的 ISO 格式 - 以便它与内部 docker 日期格式兼容。因此,可以使用普通字符串比较来比较两个日期,因为该日期格式的字典顺序与日期顺序匹配。

ps搬运工的命令没有-a选项设置,因为在默认情况下,docker ps只显示正在运行的容器-我们只需要看看那些运行杀害。

如果您定义了 docker 命令别名(例如alias docker='sudo /usr/bin/docker'),则必须替换dockersudo /usr/bin/docker在该管道中。