我之前已经问过类似的问题,但是找不到任何我需要的东西。我也曾在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。有任何关于可以做到这一点的简单代码的线索吗?
答案 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
现在这将通过记录空间信息来清除