📌  相关文章
📜  删除 x 小时前创建的所有容器 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 15:07:14.268000             🧑  作者: Mango

删除 x 小时前创建的所有容器 - Shell-Bash

在 Docker 中,经常需要清除无用的容器以节省空间并避免干扰当前开发。本文将介绍如何编写 Shell/Bash 脚本以删除 x 小时前创建的所有容器。

实现步骤
  1. 获取所有的容器 ID 和创建时间。

    containers=$(docker ps -a --format "{{.ID}}|{{.CreatedAt}}" | tail -n +2)
    

    这里使用了 docker ps 命令来获取容器列表,并使用 --format 参数制定输出格式。由于输出格式为 “ID|创建时间”(两者用竖线分隔),所以需要借助管道符 |

    tail -n +2 用于跳过第一行输出,因为第一行是标题栏。

  2. 循环遍历容器列表,判断容器创建时间是否满足删除条件。

    for container in ${containers[@]}; do
        container_id=$(echo $container | awk -F "|" '{print $1}')
        created_at=$(echo $container | awk -F "|" '{print $2}')
        created_timestamp=$(date -d "$created_at" +%s)
        current_timestamp=$(date +%s)
        duration=$(expr $current_timestamp - $created_timestamp)
        if [ $duration -gt $((x*3600)) ]; then
            docker rm $container_id
        fi
    done
    

    在循环中,使用 awk 命令以竖线为分隔符分离容器 ID 和创建时间。

    date -d "$created_at" +%s 将创建时间转换为时间戳(单位:秒)。

    date +%s 获取当前时间戳。

    计算创建时间和当前时间差的秒数,如果大于 x*3600(即 x 小时),则删除容器。

  3. 将上述代码拼接成一个完整的脚本。

    #!/bin/bash
    containers=$(docker ps -a --format "{{.ID}}|{{.CreatedAt}}" | tail -n +2)
    for container in ${containers[@]}; do
        container_id=$(echo $container | awk -F "|" '{print $1}')
        created_at=$(echo $container | awk -F "|" '{print $2}')
        created_timestamp=$(date -d "$created_at" +%s)
        current_timestamp=$(date +%s)
        duration=$(expr $current_timestamp - $created_timestamp)
        if [ $duration -gt $((x*3600)) ]; then
            docker rm $container_id
        fi
    done
    
使用方法

将脚本保存为文件(比如 remove-old-containers.sh),赋予执行权限,并运行即可。

chmod +x remove-old-containers.sh
./remove-old-containers.sh

其中,x 为要删除的容器的最大创建时间(单位:小时)。