Docker İpucu #1: Adı Olmayan (none) İmajlar Nedir? Nasıl Silinir?
Docker ile, daha genel olarak da container teknolojisi ile çalışanlardan en çok aldığımız sorulardan biri, biriken eski imajların sunucular üzerindeki disk alanını doldurması ve sistemin çalışamaz hale gelmesi/bazı fonksiyonlarını yitirmesi. Bu da hem genelde takibi iyi yapılmadığı için beklenmedik zamanlarda ortaya çıkıyor hem de hızlı bir çözüm bulunmayınca elle imaj silmeye başlamak istendiği gibi sonuçlanmayabiliyor. Bu yazıda, sistemde ismi
Docker’da imajları görüntülemek için docker images veya docker image ls komutlarını sıkça çalıştırıyorsunuzdur. Bazen bu komutların çıktısında, adı
Bu imajların oluşması için çok basit bir senaryo mevcut. Bir Dockerfile’ı istediğiniz bir imaj ismi ve etiketiyle build edin. Sonra projede bir değişiklik yaparak tekrar build edin. Sonrasında bir
Daha önceden var olan bir imaj ile aynı isim/etikete sahip yeni bir imaj geldiğinde, eskisinin isim:etiket ikilisi artık yenisine geçmiş oluyor. Bu durumda eski imajın isminin yerinde
Dolayısıyla, bu imajların olması çok doğal ve ters giden bir şeyler olduğu anlamına gelmiyor. Peki neden bu bir sorun haline geliyor? Bu imajlar kullanılmasa bile diskte yer tutmaya devam ediyor. Bu da zaman içerisinde build sayısı arttıkça diskin dolmasına sebep olabiliyor.
Bu imajlara dangling imaj deniyor. Biz de yazının devamında bu ismi de kullanacağız.
Docker, bize imaj listelemede özel bir parametre veriyor. Bu parametreyi, -f‘e söylüyoruz:
Bu komutun sonrasında şöyle bir çıktı olmalı:
İmajları listelediğimize göre, artık bunları nasıl sileceğimize bakabiliriz. Sadece ID’lerini alarak başlayalım:
Şöyle bir çıktı almamız gerekiyor:
Silmek için klasik bash subshell özelliğinden faydalanabiliriz (İmajlar silinecek, dikkatli/emin olmakta fayda var):
Komut, çıktı olarak imajların katmanlarını verecektir:
O an silinmek istenen imajdan açılmış bir container varsa, o imaj silinmeyecek ve şöyle bir uyarı verecektir:
İlgili containerları da silip, bu imajları da silmek isterseniz -f parametresi ekleyebilirsiniz.
docker image ls -f dangling=true
docker image ls -f dangling=true -q
docker image rm $(docker image ls -f dangling=true -q)
Error response from daemon: conflict: unable to delete 3a2dc323c451 (must be forced) - image is being used by stopped container 89748cb2893c