📅  最后修改于: 2023-12-03 15:07:14.268000             🧑  作者: Mango
在 Docker 中,经常需要清除无用的容器以节省空间并避免干扰当前开发。本文将介绍如何编写 Shell/Bash 脚本以删除 x 小时前创建的所有容器。
获取所有的容器 ID 和创建时间。
containers=$(docker ps -a --format "{{.ID}}|{{.CreatedAt}}" | tail -n +2)
这里使用了 docker ps
命令来获取容器列表,并使用 --format
参数制定输出格式。由于输出格式为 “ID|创建时间”(两者用竖线分隔),所以需要借助管道符 |
。
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
在循环中,使用 awk
命令以竖线为分隔符分离容器 ID 和创建时间。
date -d "$created_at" +%s
将创建时间转换为时间戳(单位:秒)。
date +%s
获取当前时间戳。
计算创建时间和当前时间差的秒数,如果大于 x*3600
(即 x 小时),则删除容器。
将上述代码拼接成一个完整的脚本。
#!/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
为要删除的容器的最大创建时间(单位:小时)。