Docker совет №11: Автоматическое удаление ненужных данных docker

Jan 1, 2018 11:42 · 303 words · 2 minute read docker

Ранее мы уже упоминали о проблеме быстрого «засорения» локального хранилища при работе с docker-контейнерами и рассматривали варианты очистки места на диске после docker вручную.

Давайте разберемся, как автоматизировать этот процесс!

В примере используется следующая версия docker:

docker -v
Docker version 17.09.0-ce, build afdb6d4

Еще начиная с версии docker-engine 1.13.0 появилась команда docker system prune, которая и используется для очистки места на диске. Однако, начиная с версии docker 17.09 поведение этой команды изменилось — ранее она удаляла все остановленные контейнеры, неиспользуемые сети, недействительные образы (у которых нет метки), тома, которые не принадлежат ни одному запущенному контейнеру и кэш сборки docker-образов, теперь тома не удаляются:

docker system prune
WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all dangling images
        - all build cache
Are you sure you want to continue? [y/N]

Запускать команду будем с ключом -f (--force, не требовать подтверждения). Чтобы команда запускалась автоматически, добавим ее в планировщик задач (в ОС Linux это утилита cron). Открываем файл crontab на редактирование с помощью команды:

crontab -e

и добавляем в него следующую строку:

0 1 * * * /usr/bin/docker system prune -f

В ОС MacOS можно воспользоваться планировщиком LaunchD. Для этого создаем файл:

sudo touch /Library/LaunchDaemons/DockerSystemPrune.plist

и вставляем в него следующие строки:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
          http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>DockerSystemPrune</string>
    <key>Program</key>
    <string>/usr/local/bin/docker system prune -f</string>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>1</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
</dict>
</plist>

Добавляем созданную задачу в планировщик командой:

launchctl load -w /Library/LaunchDaemons/DockerSystemPrune.plist

С ОС Windows я не работаю, но уверен там тоже есть возможность добавить задачу по очистке места после docker в планировщик задач.

Если вы хотите также удалять тома (volumes), которые не принадлежат ни одному запущенному контейнеру, то можно воспользоваться командой:

docker volume prune -f

и также добавить ее в планировщик задач описанным выше способом.

tweet Share