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

我知道以前也有类似的问题,但我找不到任何我需要的东西。 我也在Docker社区论坛上提出过问题,但没有人能提供帮助。

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

如果docker图像报告“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 

…但我试图弄清楚如何testing4美元,5美元只包括“月”或“=”4周“,然后可以通过dockerrmi的任何东西。 任何人有任何线索可以做到这一点简单的代码,请吗?

这里是一个脚本,你可以写在你的.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 

只需要awk

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

说明

如果第五个字段是“月”,或者等于“周”,第四个大于4,则打印所需的列。

我个人更喜欢下面的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_housekeepingdocker_housekeeping

试试这个(仅使用awk ):

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

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

不需要 grep