Backgroud
Вину за проблему можна розділити між неправильною конфігурацією томів контейнера та проблемою з витоком (невдалою звільненням) тимчасових даних, записаних у ці томи. Нам слід зіставити (або папки хостів, або інші постійні вимоги до сховища) всі тимчасові папки / журнали / подряпини поза контейнером, куди наші програми пишуть часто та / або сильно. Docker не несе відповідальності за очищення всіх автоматично створених так званих EmptyDirs, розташованих за замовчуванням в /var/lib/docker/overlay2/*/diff/*
. Вміст цих "нестійких" папок повинен бути очищений автоматично докером після зупинки контейнера, але, мабуть, ні (їх може бути навіть неможливо очистити з боку хоста, якщо контейнер все ще працює - і він може працювати місяцями зараз).
Обхідний шлях
Обхідний шлях вимагає ретельного ручного очищення, і хоча це вже було описано в іншому місці, ви все одно можете знайти деякі підказки з мого тематичного дослідження, яке я намагався зробити якомога повчальнішим та узагальненішим.
Отже, те, що сталося, - це програма-винуватець (у моєму випадку clair-scanner
), яка за кілька місяців змогла записати сотні концертів даних у /diff/tmp
підпапку docker'soverlay2
du -sch /var/lib/docker/overlay2/<long random folder name seen as bloated in df -haT>/diff/tmp
271G total
Отож, оскільки всі ці вкладені папки /diff/tmp
були досить зрозумілими (всі були у формі clair-scanner-*
і мали застарілі дати створення), я зупинив пов’язаний контейнер ( docker stop clair
) і обережно видалив ці застарілі підпапки diff/tmp
, починаючи розумно з однієї (найстарішої), і тестування впливу на двигун докера (який вимагав перезапуску [ systemctl restart docker
] для відновлення місця на диску):
rm -rf $(ls -at /var/lib/docker/overlay2/<long random folder name seen as bloated in df -haT>/diff/tmp | grep clair-scanner | tail -1)
Я відновив сотні концертів дискового простору без необхідності перевстановлювати докер або очищати цілі папки. Всі запущені контейнери мали бути зупинені в один момент, тому що для відновлення дискового простору потрібно було перезапустити демон Docker, тому переконайтеся, що спочатку ваші резервні контейнери працюють належним чином на / інших вузлах. Хоча я хотів би, щоб docker prune
команда могла охоплювати і застарілі /diff/tmp
(або навіть /diff/*
) дані (за допомогою ще одного перемикача).
Зараз це 3-річне видання, ви можете прочитати його багату та кольорову історію на форумах Docker, де варіант, спрямований на журнали застосувань вищезазначеного рішення, був запропонований у 2019 році і, схоже, працював у декількох установках: https: // forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604