Backgroud
Winę za ten problem można podzielić między błędną konfigurację woluminów kontenerów i problem z wyciekiem Dockera (brakiem możliwości zwolnienia) tymczasowych danych zapisanych w tych woluminach. Powinniśmy mapować (do folderów hosta lub innych trwałych roszczeń do przechowywania) wszystkich folderów tymczasowych / dzienników / magazynów z naszego kontenera, w których nasze aplikacje często i / lub intensywnie piszą. Docker nie bierze odpowiedzialności za czyszczenie wszystkich automatycznie tworzonych tak zwanych EmptyDirs, które domyślnie znajdują się w /var/lib/docker/overlay2/*/diff/*
. Zawartość tych "nietrwałych" folderów powinna być czyszczona automatycznie przez docker po zatrzymaniu kontenera, ale najwyraźniej nie jest (może być nawet niemożliwe do wyczyszczenia po stronie hosta, jeśli kontener nadal działa - i może działać przez miesiące na czas).
Obejście problemu
Obejście wymaga starannego ręcznego czyszczenia i chociaż zostało już opisane w innym miejscu, nadal możesz znaleźć kilka wskazówek z mojego studium przypadku, które starałem się uczynić jak najbardziej pouczającymi i uogólniającymi.
Więc co się stało, to aplikacja winowajcy (w moim przypadku clair-scanner
) zdołała zapisać w ciągu kilku miesięcy setki gigabajtów danych do /diff/tmp
podfolderu dockeraoverlay2
du -sch /var/lib/docker/overlay2/<long random folder name seen as bloated in df -haT>/diff/tmp
271G total
Ponieważ wszystkie te podfoldery /diff/tmp
były dość oczywiste (wszystkie miały formę clair-scanner-*
i miały przestarzałe daty utworzenia), zatrzymałem powiązany kontener ( docker stop clair
) i ostrożnie usunąłem te przestarzałe podfoldery z diff/tmp
, zaczynając ostrożnie od jednego (najstarszego) i testowanie wpływu na silnik Dockera (który wymagał ponownego uruchomienia [ systemctl restart docker
] w celu odzyskania miejsca na dysku):
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)
Odzyskałem setki gigabajtów miejsca na dysku bez konieczności ponownej instalacji dockera lub czyszczenia całych folderów. Wszystkie uruchomione kontenery musiały zostać zatrzymane w pewnym momencie, ponieważ ponowne uruchomienie demona Dockera było wymagane do odzyskania miejsca na dysku, więc najpierw upewnij się, że kontenery przełączania awaryjnego działają poprawnie na / innym węźle / węzłach). Chciałbym jednak, aby docker prune
polecenie obejmowało również przestarzałe /diff/tmp
(lub nawet /diff/*
) dane (za pośrednictwem jeszcze innego przełącznika).
To już 3-letnie wydanie, o jego bogatej i barwnej historii można przeczytać na forach Dockera, gdzie wariant mający na celu logi aplikacji powyższego rozwiązania został zaproponowany w 2019 roku i wydaje się działać w kilku konfiguracjach: https: // forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604