Backgroud
Sorunun suçu, konteyner birimlerinin yanlış yapılandırılması ile bu birimlere yazılan geçici verilerin docker sızıntısı (serbest bırakılamaması) ile ilgili bir sorun arasında bölünebilir. Uygulamalarımızın sık ve / veya yoğun bir şekilde yazdığı, kapsayıcının tüm geçici / günlükleri / sıfırdan klasörlerini eşlemeliyiz (klasörleri veya diğer kalıcı depolama taleplerini barındırmak için). Docker, varsayılan olarak /var/lib/docker/overlay2/*/diff/*
. Bu "kalıcı olmayan" klasörlerin içeriği, konteyner durdurulduktan sonra docker tarafından otomatik olarak temizlenmelidir, ancak görünüşe göre değildir (konteyner hala çalışıyorsa ana bilgisayar tarafından temizlemek bile imkansız olabilir - ve aylarca çalışabilir. zamanında).
Geçici çözüm
Bir geçici çözüm, dikkatli bir manuel temizlik gerektirir ve başka bir yerde zaten açıklanmış olsa da, mümkün olduğunca öğretici ve genelleştirilebilir yapmaya çalıştığım vaka çalışmamdan bazı ipuçları bulabilirsiniz.
Suçlu uygulama (benim durumumda clair-scanner
) /diff/tmp
liman işçilerinin alt klasörüne birkaç ay boyunca yüzlerce konser veri yazmayı başardı.overlay2
du -sch /var/lib/docker/overlay2/<long random folder name seen as bloated in df -haT>/diff/tmp
271G total
Bu nedenle, içindeki tüm alt klasörler /diff/tmp
oldukça açıklayıcı olduğundan (tümü clair-scanner-*
biçimdeydi ve eski oluşturulma tarihlerine sahipti), ilişkili kapsayıcıyı ( docker stop clair
) durdurdum ve bu eski alt klasörleri dikkatlice kaldırdım diff/tmp
, tek bir (en eski) klasörle ihtiyatlı bir şekilde başlayarak ve docker motoru üzerindeki etkiyi test etmek ( systemctl restart docker
disk alanını geri kazanmak için [ ] yeniden başlatmayı gerektiriyordu ):
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'ı yeniden kurmaya veya tüm klasörlerini temizlemeye gerek kalmadan yüzlerce disk alanını geri kazandım. Disk alanını geri kazanmak için docker daemon yeniden başlatılması gerektiğinden, çalışan tüm kapsayıcıların bir noktada durdurulması gerekiyordu, bu nedenle önce yük devretme kapsayıcılarınızın bir / diğer düğümde / düğümlerde doğru şekilde çalıştığından emin olun. Keşke docker prune
komut eski /diff/tmp
(veya hatta /diff/*
) verileri de (başka bir anahtar aracılığıyla) kapsayabilir .
Bu 3 yıllık bir sorun, zengin ve renkli geçmişini Docker forumlarında okuyabilirsiniz, burada yukarıdaki çözümün uygulama günlüklerini hedefleyen bir varyant 2019'da önerildi ve birkaç kurulumda işe yaradığı görülüyor: https: // forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604