2017-02-21 36 views
2

Я знаю, что подобные вопросы были заданы раньше, но я не могу найти что-либо, что делает именно то, что мне нужно. Я также спрашивал на форумах Docker Community, но никто не мог помочь.Простой скрипт, необходимый для удаления всех изображений докеров старше 4 недель

У меня нет доступа к новой команде docker image prune, так как я не могу выполнить обновление с текущей версии 1.11.2 до последней версии 1.1, но мне нужен простой скрипт, который можно запустить под 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

Я предпочел бы использовать 'Докер инспектировать $ (Докер изображения -q)' и найти нужное поле – user2915097

ответ

2

здесь сценарий, и вы можете написать его в .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

Попробуйте это (используя awk только):

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

Im используя, если оператор и скобки, чтобы обеспечить порядок выполнения.

Вы не принимаете до grep.

+0

Спасибо Фархад, но это не сработало - он пропускает изображение, которое 10 недель. – HelenH

+0

Попробуйте отредактированный ответ, пожалуйста. –

+0

Это работает сейчас, спасибо – HelenH

3

Просто awk необходимо:

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

Объяснение

Если пятое поле "месяцев" , или равно «неделям» и 4-му большему, чем 4, напечатайте необходимые столбцы.

1

Я лично предпочитаю следующую Баш функцию:

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 каждый раз вы хотите сделать очистку.

0

Вы можете использовать флаг -f, чтобы добавить фильтр.

Найти идентификатор изображения старше 4 недель.И выполнить следующую команду

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