Hintergrund
Die Schuld für das Problem kann zwischen unserer Fehlkonfiguration von Containervolumes und einem Problem mit Docker-Lecks (die nicht freigegeben werden) temporärer Daten, die auf diese Volumes geschrieben wurden, aufgeteilt werden. Wir sollten alle temporären / logs / Scratch-Ordner unseres Containers (entweder Host-Ordnern oder anderen dauerhaften Speicheransprüchen) zuordnen, in denen unsere Apps häufig und / oder stark schreiben. Docker übernimmt keine Verantwortung für die Bereinigung aller automatisch erstellten sogenannten EmptyDirs, die sich standardmäßig in befinden /var/lib/docker/overlay2/*/diff/*
. Der Inhalt dieser "nicht persistenten" Ordner sollte nach dem Stoppen des Containers automatisch vom Docker gelöscht werden, ist dies aber anscheinend nicht (es kann sogar unmöglich sein, ihn von der Hostseite zu löschen, wenn der Container noch ausgeführt wird - und er kann monatelang ausgeführt werden zu einem Zeitpunkt).
Problemumgehung
Eine Problemumgehung erfordert eine sorgfältige manuelle Bereinigung, und obwohl sie bereits an anderer Stelle beschrieben wurde, finden Sie möglicherweise noch einige Hinweise aus meiner Fallstudie, die ich so lehrreich und verallgemeinerbar wie möglich zu gestalten versuchte.
Was also passiert ist, ist, dass die Täter-App (in meinem Fall clair-scanner
) es geschafft hat, über einige Monate Hunderte von Datenmengen in den /diff/tmp
Unterordner von Docker zu schreibenoverlay2
du -sch /var/lib/docker/overlay2/<long random folder name seen as bloated in df -haT>/diff/tmp
271G total
Da alle diese Unterordner /diff/tmp
ziemlich selbsterklärend waren (alle hatten die Form clair-scanner-*
und veraltete Erstellungsdaten), stoppte ich den zugehörigen Container ( docker stop clair
) und entfernte diese veralteten Unterordner diff/tmp
vorsichtig aus , wobei ich vorsichtig mit einem einzigen (ältesten) begann, und Testen der Auswirkungen auf die Docker-Engine (für die ein Neustart [ systemctl restart docker
] erforderlich war , um Speicherplatz zurückzugewinnen):
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)
Ich habe Hunderte von GB Speicherplatz zurückgefordert, ohne Docker neu installieren oder die gesamten Ordner löschen zu müssen. Alle ausgeführten Container mussten an einem Punkt gestoppt werden, da ein Neustart des Docker-Daemons erforderlich war, um Speicherplatz zurückzugewinnen. Stellen Sie daher zunächst sicher, dass Ihre Failover-Container auf einem / anderen Knoten ordnungsgemäß ausgeführt werden. Ich wünschte jedoch, dass der docker prune
Befehl auch die veralteten /diff/tmp
(oder sogar /diff/*
) Daten abdecken könnte (über einen weiteren Schalter).
Es ist jetzt eine 3 Jahre alte Ausgabe. Sie können die reichhaltige und farbenfrohe Geschichte in Docker-Foren lesen, in denen 2019 eine Variante vorgeschlagen wurde, die auf Anwendungsprotokolle der oben genannten Lösung abzielt und anscheinend in mehreren Setups funktioniert hat: https: // forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604