Backgroud
Penyebab masalah ini dapat dibagi antara kesalahan konfigurasi volume penampung kami, dan masalah dengan buruh pelabuhan yang bocor (gagal merilis) data sementara yang ditulis ke volume ini. Kita harus memetakan (baik ke folder host atau klaim penyimpanan persisten lainnya) semua dari folder temporer / logs / scratch di mana aplikasi kita sering menulis dan / atau berat. Docker tidak bertanggung jawab atas pembersihan semua yang dibuat secara otomatis yang disebut EmptyDirs yang terletak secara default di /var/lib/docker/overlay2/*/diff/*
. Isi dari folder "non-persistent" ini harus dibersihkan secara otomatis oleh buruh pelabuhan setelah kontainer dihentikan, tetapi ternyata tidak (mereka bahkan tidak mungkin untuk dihapus dari sisi host jika kontainer masih berjalan - dan dapat berjalan selama berbulan-bulan pada suatu waktu).
Solusi
Sebuah solusi membutuhkan pembersihan manual yang hati-hati, dan meskipun sudah dijelaskan di tempat lain, Anda masih dapat menemukan beberapa petunjuk dari studi kasus saya, yang saya coba buat se-instruktif dan digeneralisasikan mungkin.
Jadi yang terjadi adalah aplikasi pelakunya (dalam kasus saya clair-scanner
) berhasil menulis selama beberapa bulan ratusan pertunjukan data ke /diff/tmp
subfolder dari buruh pelabuhanoverlay2
du -sch /var/lib/docker/overlay2/<long random folder name seen as bloated in df -haT>/diff/tmp
271G total
Jadi karena semua subfolder di dalamnya /diff/tmp
cukup jelas (semuanya dalam bentuk clair-scanner-*
dan memiliki tanggal pembuatan yang sudah tidak berlaku), saya menghentikan wadah terkait ( docker stop clair
) dan dengan hati-hati menghapus subfolder usang ini dari diff/tmp
, mulai dengan hati-hati dengan satu (tertua), dan menguji dampaknya pada mesin buruh pelabuhan (yang memang membutuhkan restart [ systemctl restart docker
] untuk mendapatkan kembali ruang disk):
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)
Saya mendapatkan kembali ratusan pertunjukan ruang disk tanpa perlu menginstal ulang buruh pelabuhan atau membersihkan seluruh foldernya. Semua container yang sedang berjalan harus dihentikan pada satu titik, karena restart daemon docker diperlukan untuk mendapatkan kembali ruang disk, jadi pastikan dulu container failover Anda berjalan dengan benar pada / node lain). Saya berharap bahwa docker prune
perintah itu dapat mencakup data yang usang /diff/tmp
(atau bahkan /diff/*
) juga (melalui sakelar lain).
Ini adalah masalah berusia 3 tahun sekarang, Anda dapat membaca riwayatnya yang kaya dan penuh warna di forum Docker, di mana varian yang ditujukan untuk log aplikasi dari solusi di atas diusulkan pada tahun 2019 dan tampaknya telah berfungsi dalam beberapa pengaturan: https: // forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604