Docker совет №11: Автоматическое удаление ненужных данных docker
Jan 1, 2018 11:42 · 303 words · 2 minute read
Ранее мы уже упоминали о проблеме быстрого «засорения» локального хранилища при работе с 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
и также добавить ее в планировщик задач описанным выше способом.