删除超过4周的所有泊坞窗图像需要简单的脚本

时间:2017-02-21 10:10:43

标签: bash shell docker awk sh

我之前已经问过类似的问题,但是找不到任何我需要的东西。我也曾在Docker社区论坛上提问,但没有人可以提供帮助。

我无法访问新的docker image prune命令,因为我无法从当前版本1.11.2升级到最新的whizzy 1.13,但我需要一个可以在cron下运行的简单脚本删除1个月以上的所有图像,无论是否悬空。我不需要担心容器,因为这是来自只存储图像的仓库。

如果码头图片报告“4周”为“1个月”,那将很简单,我可以使用像

这样的东西
docker images | grep " [months]* "

并将输出传递给docker rmi命令。但是,由于它似乎在“周”报告长达11周,而且只有“月”报告图像是3个月或以上,我不能这样做。

docker images | grep " [months|weeks]* ago" | awk '{print $3,$4,$5}'

会给我这个输出::

6828f152f9cc 2 weeks
52a7412befd3 2 weeks
04c2b29e5e08 2 weeks
cdfb37d22663 2 weeks
ca38a8cabb2b 3 weeks
8b043f2395ba 3 weeks
2aa8b20380a0 3 weeks
1ac7dcf35935 9 weeks
f80873c4845b 9 weeks
d5700d37ee95 9 weeks
594dc21de8de 9 weeks
0c9dacb7fa7c 10 weeks
11f3eec60e17 3 months
b13ebf1a4999 3 months
68b0d6a3be3b 7 months
baadc9c8b0ce 8 months
10eb0d6b2b99 9 months

...但是我一直试图弄清楚如何测试$ 4,$ 5只包含任何“月”或“> 4周”的东西,然后可以通过管道传输到码头rmi。有任何关于可以做到这一点的简单代码的线索吗?

6 个答案:

答案 0 :(得分:3)

这是一个脚本,您可以在.bashrc

中编写它
#!/bin/bash

max_week_size=4
docker images | awk 'NR>1 {print $0}' | while read line; do
    # echo $line
    id_img=$(echo $line | awk '{print $3}')

    # if older then a month
    is_month=$(echo $line | grep 'month')
    if [ ! -z "$is_month" ]; then 
        echo $id_img
        docker rmi -f $id_img
        continue
    fi

    # remove older then 4 weeks
    num_week=$(echo $line | grep "week" | awk '{print $4}')
    if [ ! -z "$num_week" ] && [ $num_week -ge $max_week_size ]; then 
        echo $id_img
        docker rmi -f $id_img
    fi
done

答案 1 :(得分:3)

只需要awk

docker images |awk '$5=="months" || ($4>4 && $5=="weeks") {print $3,$4,$5}'

<强>解释

如果第5个字段是&#34;个月&#34;或者等于&#34;周&#34;和第4个大于4,打印所需的列。

答案 2 :(得分:1)

尝试此操作(仅使用drug one drug two drug three ):

awk

我使用if语句和括号来确保执行顺序。

不需要docker images |awk '{if (($4 > 4 && $5 == "weeks") || ($4 > 1 && $5 == "months")) {print $3,$4,$5}}'

答案 3 :(得分:1)

我个人更喜欢以下bash功能:

docker_housekeeping() {

  # Collect list of images older than 4 weeks.
  OLD_IMAGES=$((docker images |
                grep -P "(months|[4-9] weeks|\d\d+ weeks)" |
                awk '{print $3}'))

  # Remove old images.
  docker rmi ${OLD_IMAGES[@]}
}

您可以坚持使用.bashrc,只需在每次清理时将其称为docker_housekeeping

答案 4 :(得分:1)

您可以使用-f标志添加过滤器。

查找超过4周的图片ID。并执行以下命令

docker rmi $(docker images -q -f "before=<docker_image_id_older_than_4_weeks>")

答案 5 :(得分:1)

您可以尝试以下脚本,我正在以下脚本中使用

#!/bin/bash

timestamp=$(date +%Y%m%d_%H%M%S)
log_path="`pwd`"
filename=docker_cleanup_$timestamp.log
log=$log_path/$filename


docker_space_before(){
CURRENTSPACE=`docker system df`
echo "Current Docker Space:" >> $log
echo $CURRENTSPACE >>$log
}
docker_find (){
echo "#####################################################################" >> $log
echo "Finding images" >> $log
echo "#####################################################################" >> $log
REMOVEIMAGES=`docker images | grep " [days|months|weeks]* ago" | awk '{print $3}'`

echo "Listing images that needs to be cleaned up" >> $log
echo $REMOVEIMAGES >>$log

}

docker_cleanup(){
echo "#####################################################################" >> $log
echo "Cleaning images" >> $log
echo "#####################################################################" >> $log
docker rmi ${REMOVEIMAGES}
}

docker_space_after(){
CURRENTSPACE=`docker system df`
echo "Current Docker Space, after clean up:" >> $log
echo $CURRENTSPACE >>$log
}
docker_space_before
docker_find
docker_cleanup
docker_space_after

现在这将通过记录空间信息来清除