Eski Docker kapsayıcıları nasıl kaldırılır


1235

Bu soru, fazla çalışan, çalışmayan Docker kapları hakkında endişelenmem gerekir mi? .

Eski kapları nasıl kaldıracağımı merak ediyorum. docker rm 3e552code34aTek bir tane kaldırmak sağlar, ama ben zaten çok var. docker rm --helpbir seçim seçeneği sunmaz (herkes gibi veya resim adına göre).

Belki de bu kapların saklandığı ve kolayca elle silebileceğim bir dizin var mı?


21
Ayrıca yetim kalmış liman işçisi birimlerini de temizlemeyi düşünmelisiniz. Sıklıkla eski kaplardan ve eski görüntülerden çok daha fazla yer tükettiklerini görüyorum. Yetiştirilmiş liman işçisi birimlerini kaldırmak için iyi bir komut dosyası şu adreste bulunabilir: github.com/chadoe/docker-cleanup-volumes .
Nemanja Trifunovic

Belki github.com/chadoe/docker-cleanup-volumes size yardımcı olabilir.
Mihai8

Ayrıca , kapsayıcı geçici hale getirecek bayrakla docker runbirlikte --rm, çalıştırmadan sonra tüm kapsayıcı dosyalarını kaldırabilirsiniz .
Gordon

12
Docker 1.13 (Q4 2016) ile yeni docker system prunekomutu da düşünebilirsiniz . Bkz aşağıda Cevabımı .
VonC

1
Liman işçiliği yönetim aracını kullanın Bu aracı kullanarak Portainer yönetebiliriz all the old containers, non using volumes and imagesPlease refer my update below on how to deploy the application
Liman

Yanıtlar:


1460

Docker 1.13.x sürümünden bu yana Docker konteyneri budama özelliğini kullanabilirsiniz :

docker container prune

Bu, durdurulan tüm kapları kaldıracaktır ve tüm platformlarda aynı şekilde çalışmalıdır.

Ayrıca bir Docker sistemi budaması da vardır :

docker system prune

kullanılmayan tüm kapları, ağları, görüntüleri (hem sarkan hem de gösterilmeyen) ve isteğe bağlı olarak birimleri tek bir komutta temizler.


Daha eski Docker sürümlerinde, ihtiyacınız olanı elde etmek için Docker komutlarını diğer Unix komutlarıyla birlikte dizebilirsiniz. Haftalık eski kapların nasıl temizleneceğine ilişkin bir örnek:

$ docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm

Vadesi geldiğinde kredi vermek için bu örnek https://twitter.com/jpetazzo/status/347431091415703552 adresinden alınmıştır .


92
Etiketlenmemiş tüm görüntüleri kaldırmak için benzer komut: docker images | grep "<none>" | awk '{print $3}' | xargs docker rmi
Mohan Raj

7
@ MichelMüller, bir dockerfile dosyasından bir görüntü oluştururken, başarılı bir derlemeden -rmsonra ara kapları kaldırma seçeneğini belirleyebilirsiniz.
Freek Kalter

3
@ MichelMüller önbellekleme için kullanılan görüntülerdir, bu nedenle kapların çıkarılması bunu etkilemez.
Ken Cochrane

7
Bunun için awk kullanmak istiyorsanız, tüm durdurulmuş kapları rm yapmak istiyorsanız bu komutu göz önünde bulundurun (ilk satırdan dolayı bir hata olmadan):docker ps -a | awk 'NR > 1 {print $1}' | xargs docker rm
masi

3
Bu, etiketlenmemiş görüntüleri kaldırmak için güncellenmiş komut olmalıdırdocker rmi $(docker images -q -f dangling=true)
Ghjnut

626

Guillaume J. Charmes'den aldığı başka bir yöntem (vadesi geldiğinde kredi):

docker rm `docker ps --no-trunc -aq`

tüm kapları zarif bir şekilde çıkaracaktır.

Ve Windows için Bartosz Bilicki tarafından:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i

PowerShell için:

docker rm @(docker ps -aq)

Docker 1.13 (Q4 2016) ile bir güncelleme, kredi VonC ( sonradan bu thread ):

docker system prune TÜM kullanılmayan verileri siler (örneğin: kapsayıcılar durduruldu, kapsayıcı olmayan hacimler ve kapsayıcı içermeyen resimler).

Bkz PR 26108 ve 86de7c0 taahhüt yardım için birkaç yeni komutlar sunuyoruz, Docker cin veri diskte alarak ve kolayca "gereksiz" aşırı temizlik sağlayan ne kadar alanın görüntülenmesi kolaylaştırmaktadır.

docker system prune

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y

11
bu bir şekilde benim için çalışmıyor, ama docker ps -a -q | xargs docker rmçalışıyor, (sudo gerekebilir)
FUD

86
Ne hakkında docker rm $(docker ps -a -q)?
qkrijger

8
@qkrijger, bu bashizm eklemek dışında orijinal yanıtınızdan bir şey değiştirmez. Sorun komut satırı taşmasıdır. xargs varyantı güzel bir şekilde ilgilenir. Ayrıca (beklenmedik) kimlik çatışmalarını önlemek için docker ps - no-trunk eklerdim.
Ihor Kaharlichenko

8
yalnızca veri içeren bir kap kullanırsanız, bunları da kaldırır
Dzung Nguyen

4
Birlikte nokta görmüyorum --no-truncçünkü docker rmzaten tam kimlikleri ihtiyacı yoktur.
Pithikos

411

Güncel Cevap Kullanın docker system pruneveya docker container pruneşimdi. VonC'nin güncellenmiş cevabına bakın .

Önceki Yanıt Yukarıda birkaç farklı ipucu oluşturan, çalışmayan tüm konteynerleri kaldırmanın en zarif yolu şöyledir:

docker rm $(docker ps -q -f status=exited)

  • -q yalnızca kapsayıcı kimliklerini yazdırır (sütun başlıkları olmadan)
  • -f yazdırılan kaplar listenizi filtrelemenize olanak tanır (bu durumda yalnızca çıkan kapları göstermek için filtreleme yapıyoruz)

7
Bu doğru yanıt olmalıdır, çünkü $ (docker görüntüleri) metin çıktı biçiminin değişmeyeceğini varsaymak yerine, artık hangi kapların artık kullanılmadığını söylemek için docker'a dayanır. İki yerine sadece bir ekstra işlemin doğması için bonus puan.
eurythmia

18
Sen eklemek isteyebilirsiniz -vhacimleri sarkan önlemek için: docker rm -v $(docker ps -q -f status=exited). Sarkan hacimler hakkında ayrıntılı bilgi için docs.docker.com/userguide/dockervolumes/… adresine bakın .
rluba

Görünüşe göre Docker 1.9'da bu sorunu ele almak için ayrı bir birim API'si olacak. github.com/docker/docker/pull/14242
Ryan Walls

bir takma ad kullanışlı olabilir:alias docker-gc="docker rm -v \$(docker ps -q -f status=exited)"
Frank Neblung

Doğru olarak işaretlenen cevabın aksine, @RyanWalls cevabı OSX üzerinde çalışır ve daha özlü olur.
Ray

255

Resmi yol :

docker rm `docker ps -aq`

Docker bakıcıları bunun için bir komut olmayacağını belirttiler - ve siz şu komutları yazıyorsunuz:

Bunu daha önce tartıştık ve kullanıcıların Docker'a ek kod eklemek zorunda kalmadan yukarıdaki satırı kullanmasını tercih ettik.


6
Yine de bu kötü bir çözümdür, çünkü saklama kaplarını da siler.
Sobrique

8
Ne demek "saklama kapları"? Veri birimlerine referansları tutmak için bir zamanlar kullanılan yalnızca veri içeren kapsayıcılar kastediyorsanız, docker volumealt komutun kullanılabilirliği ve adlandırılmış birimler nedeniyle artık gerekli değildir .
L0j1k

Bunun Windows Powershell'de çalışmadığını unutmayın. Bunun için bu daha iyi bir çözümdür: stackoverflow.com/a/23674294/1150683
Bram Vanroy

@Sobrique Eğer tepki göstermezseniz, en azından yorumunuzu silmelisiniz, neredeyse tam ve zararlı bir saçmalıktır.
peterh - Monica'yı

128

Docker 1.13 (4. Çeyrek 2016) ile artık:

docker system prune -a TÜM kullanılmayan verileri siler (örneğin: kapsayıcılar durduruldu, kapsayıcı olmayan hacimler ve kapsayıcı içermeyen resimler).

docker system prune-a olmadan, smilebomb tarafından yorumlandığı gibi yalnızca sarkan görüntüleri veya etiketi olmayan görüntüleri kaldıracaktır .

Bkz PR 26108 ve 86de7c0 taahhüt yardım için birkaç yeni komutlar sunuyoruz, Docker cin veri diskte alarak ve kolayca "gereksiz" aşırı temizlik sağlayan ne kadar alanın görüntülenmesi kolaylaştırmaktadır.

docker system prune -a

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y

Wjv'nin yorumladığı gibi ,

Ayrıca, docker {container,image,volume,network} pruneyalnızca bir tür nesnenin kullanılmayan örneklerini kaldırmak için de kullanılabilir .

Sunulan 913e5cb taahhüt sadece Docker 1.13+ için.

docker container prune


Her zamanki gibi, -fsoruyu sormadan temizlemeyi zorlamak için bayrağı ekleyin .
Dirk

3
günümüzün doğru cevabı olarak işaretlenmelidir, yukarıdakilerin çoğu zamanında geri geldi, ancak gün aşırı karmaşık değil
Eugen Mayer

Kabul etti, son zamanlarda çok daha kolay, yukarı çık!
Maxim Geerinck

Kod bloğundaki açıklama, docker system prune -akullanılmayan görüntüleri kaldıran içindir. docker system pruneyalnızca sarkan görüntüleri veya etiketi olmayan görüntüleri kaldırır .
smilebomb

104

Kullanımı artık mümkün filtreleme ile docker ps:

docker rm $(docker ps -q -f status=exited)

Ve görüntüler için :

docker rmi $(docker images -q -f "dangling=true")

Bununla birlikte, bunlardan herhangi biri, eşleşen kap olmadığında bir hataya neden olur docker rmveya docker rmiatar. Eski docker rm $(docker ps -aq)hile, çalışan herhangi bir kabı çıkarmaya çalışırken her birinde daha da kötüydü.

İşte size eklemek için daha temiz bir komut dosyası ~/.bashrcveya ~/.profile:

# Use `docker-cleanup --dry-run` to see what would be deleted.

function docker-cleanup {
  EXITED=$(docker ps -q -f status=exited)
  DANGLING=$(docker images -q -f "dangling=true")

  if [ "$1" == "--dry-run" ]; then
    echo "==> Would stop containers:"
    echo $EXITED
    echo "==> And images:"
    echo $DANGLING
  else
    if [ -n "$EXITED" ]; then
      docker rm $EXITED
    else
      echo "No containers to remove."
    fi
    if [ -n "$DANGLING" ]; then
      docker rmi $DANGLING
    else
      echo "No images to remove."
    fi
  fi
}

Düzenleme: Aşağıda belirtildiği gibi, orijinal yanıt, görüntüleri değil kapsayıcıları kaldırmaktı. Belgelere yeni bağlantılar da dahil olmak üzere her ikisine de yanıt verecek şekilde güncellendi. Adrian'a (ve Ryan'ın cevabına) yeni psfiltrelemeden bahsettiği için teşekkürler .


2
Bunun gerçek avantajına dikkat edin - yanlışlıkla storageconatiner'ları öldürmezsiniz .
Sobrique

3
Ayrıca status=created, çalışmayan ve hiç çalışmayanları almak için de kullanabilirsiniz .
enderland

96

GÜNCELLEME 2019 (YENİ)

docker container prune

Bu - 2017 (ESKİ) yol

TÜM DURDURULAN KONTEYNERLERİ çıkarmak için

docker rm $(docker ps -a -q)

TÜM KONTEYNERLERİ çıkarmak için (DURDURULDU VE DURDURULMADI)

docker rm  -f $(docker ps -a -q)

3
indirildi, çünkü 2017'de bunu yapma şekliniz kesin değil - whis olurdu docker volume/container/image prune, bkz. stackoverflow.com/a/39860665/3625317
Eugen Mayer

6
a) bu cevap 2016'dan geldiğinden ve b) bol insan kanayan kenarı çalıştırmazsa, aşağı oyuna karşı koymak için oy verdi.
düşkün

49

Durdurulmuş tüm kapları çıkarın:

docker rm $(docker ps -a | grep Exited | awk '{print $1}')

Pauk960 tarafından yapılan yorumdan :

Versiyon 1.3.0'dan beri filtreleri kullanmak docker psyerine grep Exitedkullanabilirsiniz docker ps -a -f status=exited. Ve onunla kullanırsanız -q, sadece tam çıktı yerine konteyner kimlikleri alabilirsiniz, bunun için awk kullanmaya gerek yoktur.


33

Eğer tüm konteynerleri kaldırmak gibi yapmazsanız, öncesinde veya birlikte belirli bir konteyner sonra oluşturulan tüm kapları seçebilir docker ps --before <container-ID>ya da docker ps --since <container-ID>. Bu özellik en azından Docker 0.6.5 sürümündedir.

Diyelim ki sisteminizi geliştirdiniz ve şimdi çalışıyor, ancak birkaç kap kaldı. Bu çalışma sürümünden önce oluşturulan kapsayıcıları kaldırmak istiyorsunuz. İle çalışma kabının kimliğini belirleyin docker ps.

Başka bir kaptan önce oluşturulan kapları kaldırın

docker rm $(docker ps --before 9c49c11c8d21 -q)

Başka bir örnek. Veritabanınız zaten bir Docker kapsayıcısında çalışıyor. Uygulamanızı başka bir kapsayıcıda çalışacak şekilde geliştirdiniz ve şimdi bir dizi gereksiz kapınız var.

Belirli bir kaptan sonra oluşturulan kapları kaldırın

docker rm $(docker ps --since a6ca4661ec7f -q)

Docker, konteynerleri /var/lib/docker/containersUbuntu'da depolar . Fazladan kapların başka bir zararı olmadığını düşünüyorum, ancak disk alanı kaplıyor.


32

Güncelleme: Docker sürüm 1.13'ten (Ocak 2017'de piyasaya sürüldü) itibaren, durdurulan kapsayıcıları, kullanılmayan birimleri, sarkan görüntüleri ve kullanılmayan ağları temizlemek için aşağıdaki komutu verebilirsiniz:

docker system prune

Yalnızca exiteddurumu olan kapsayıcıları sildiğinizden emin olmak istiyorsanız , şunu kullanın:

docker ps -aq -f status=exited | xargs docker rm

Benzer şekilde, liman işlerini temizliyorsanız, etiketsiz, adsız görüntülerden şu şekilde kurtulabilirsiniz:

docker images -q --no-trunc -f dangling=true | xargs docker rmi

22

İşte benim olduğunu docker-cleanupetiketsiz kaplar ve görüntüleri kaldırır senaryo. Lütfen güncellemeler için kaynağı kontrol edin.

#!/bin/sh
# Cleanup docker files: untagged containers and images.
#
# Use `docker-cleanup -n` for a dry run to see what would be deleted.

untagged_containers() {
  # Print containers using untagged images: $1 is used with awk's print: 0=line, 1=column 1.
  docker ps -a | awk '$2 ~ "[0-9a-f]{12}" {print $'$1'}'
}

untagged_images() {
  # Print untagged images: $1 is used with awk's print: 0=line, 3=column 3.
  # NOTE: intermediate images (via -a) seem to only cause
  # "Error: Conflict, foobarid wasn't deleted" messages.
  # Might be useful sometimes when Docker messed things up?!
  # docker images -a | awk '$1 == "<none>" {print $'$1'}'
  docker images | tail -n +2 | awk '$1 == "<none>" {print $'$1'}'
}

# Dry-run.
if [ "$1" = "-n" ]; then
  echo "=== Containers with uncommitted images: ==="
  untagged_containers 0
  echo

  echo "=== Uncommitted images: ==="
  untagged_images 0

  exit
fi

# Remove containers with untagged images.
echo "Removing containers:" >&2
untagged_containers 1 | xargs --no-run-if-empty docker rm --volumes=true

# Remove untagged images
echo "Removing images:" >&2
untagged_images 3 | xargs --no-run-if-empty docker rmi

Kaynak: https://github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanup


@BradMurray Teşekkürler! Bunları da beğenebilirsiniz: github.com/blueyed/dotfiles/commit/…
blueyed

3
xargs --no-run-if-emptyOpsiyon nedeniyle OSX üzerinde çalışmaz
caktux

13

İlk olarak, konteynerleri çıkarmaya çalışmadan önce çalıştırmayı durdurun

Çalışan kapları çıkarın

docker rm $(docker stop -t=1 $(docker ps -q))

Bunun killyerine kullanabilirsiniz stop. Benim durumumda, stopher seferinde onları yeniden çalıştırmaya karşı yeni bir tane oluşturma eğiliminde olduğumu tercih ediyorum, bu yüzden onları güzel bir şekilde kapatmaya çalışıyorum.

Not: Bir kapsayıcıyı durdurmaya çalışmak size bir hata verecektir:

Hata: Çalışan bir kapsayıcıyı kaldırmak imkansız, lütfen önce durdurun

Tüm kapları çıkarın

docker rm $(docker ps -a -q)

11

Tüm kapsayıcıları Windows kabuğundan kaldırma:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i

Bu ilk sayfa olduğu için cevabıma ekleyeceğim. Teşekkürler
qkrijger

"Windows kabuğundan" ? Şunu mu demek istediniz: "Windows kabuğunu (CMD) kullanma" ?
Peter Mortensen

10

https://github.com/HardySimpson/docker-cleanup

Docker temizleme

Kaldırılan küçük bir hepsi bir arada kabuk:

  • Bir günden daha önce çalışmayan kaplar
  • Kalan konteynere ait olmayan resimler

Bir crontab işi olarak çalışmak niyetinde

özellik

  • Tüm <none>:<none>resimleri kaldıracak
  • Resmin birden fazla repo: tag referansı varsa, bir kap çalıştırmak dışında tüm repo: etiketini kaldırır. Aslında "docker rmi" nin bir doğasıdır.
  • Ekranda birçok hata mesajı görünecek ve karar verip 2>/dev/nullvermeyeceğinize karar verebilirsiniz
  • Docker-gc'den bir şey öğrenin ve sorununu çözün (birden fazla repo: tag içeren resim kaldırılamaz)

9

Bu nedenle, kişisel olarak bunu yalnızca en son n kapsayıcısını ve resimlerini koruyarak hem resimler hem de kapsayıcılar için dağıtım komut dosyanızın bir parçası olarak yapmanızı öneririm. Docker görüntülerimi git tagher zaman en son Docker görüntüsünü "en son" ile etiketlemenin yanı sıra kullandığım sürümleme şemasıyla da etiketliyorum. Bu, hiçbir şeyi temizlemeden Docker görüntülerimin aşağıdaki gibi görüneceği anlamına gelir:

REPOSITORY              TAG       IMAGE ID        CREATED         VIRTUAL SIZE
some_repo/some_image    0.0.5     8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    latest    8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    0.0.4     0beabfa514ea    45 hours ago    925.4 MB
some_repo/some_image    0.0.3     54302cd10bf2    6 days ago      978.5 MB
some_repo/some_image    0.0.2     0078b30f3d9a    7 days ago      978.5 MB
some_repo/some_image    0.0.1     sdfgdf0f3d9a    8 days ago      938.5 MB

Şimdi, elbette tüm görüntülerimin (veya konteynerlerimin) tüm üretim kutularımda kalıcı olmasını sağlamak istemiyorum. Sadece son 3 veya 4'ü geri almak ve diğer her şeyden kurtulmak istiyorum. Unix's tailburada en iyi arkadaşın. Bu tarihten beri docker imagesve docker psher ikisi de tarihe göre sıralanırken, yalnızca taililk üçten fazlasını seçip kaldırabiliriz:

docker rmi $(docker images -q | tail -n +4)

Çok fazla yer kaplamadan veya eski görüntülerle işleri karıştırmadan rahatça geri dönmek için her zaman yeterli görüntüyü saklamak için dağıtım komut dosyalarınızla (veya yerel olarak) çalıştırın.

Şahsen, üretim kutumda herhangi bir zamanda sadece bir kap tutuyorum, ancak daha fazlasını isterseniz aynı tür kapları da yapabilirsiniz:

docker rm $(docker ps -aq | tail -n +4)

Son olarak, basitleştirilmiş örneğimde, bir seferde sadece bir havuzla uğraşıyoruz, ancak daha fazlasına sahipseniz, aynı fikirle biraz daha sofistike olabilirsiniz. Diyelim ki son üç görüntüyü some_repo / some_image adresinden saklamak istiyorum. Sadece karışabilirim grepve awkyoluma devam edebilirim:

docker rmi $(docker images -a | grep 'some_repo/some_image' | awk '{print $3}' | tail -n +4)

Yine, aynı fikir kaplar için de geçerlidir, ancak bu noktaya kadar alırsınız, bu yüzden örnek vermeyi bırakacağım.


8

kullanın:

docker rm -f $(docker ps -a -q)

Yerel olarak bulunan tüm kapları zorla durdurur ve çıkarır.


Lütfen daha fazla bilgi ile düzenleyin. Yalnızca kod ve "bunu dene" yanıtları önerilmez, çünkü bunlar aranabilir içerik içermez ve birisinin neden "bunu denemesi" gerektiğini açıklamaz. Burada bilgi kaynağı olmak için gayret gösteriyoruz.
Brian Tompsett - 莱恩 莱恩

Ubuntu 16.04'te docker sudo gerektirir, bu yüzden yazmanız gerekir sudo docker rm -f $(sudo docker ps -a -q).
Elliott

bir artı olarak, bu da powershell altında Windows'da çalışır!
Robert Ivanc

@Elliott sudoKullanıcı 'docker' grubuna eklemediğiniz sürece her yerde gerekli olduğunu düşünüyorum . Ubuntu 16.10'u sudo olmadan docker grubuna ekleyerek kullanıyorum.
emory

7

En eski 5 kabı çıkarın:

docker rm `docker ps -aq | tail -n 5`

Kaç konteyner kaldığını görün:

docker ps -aq | wc -l

Nice Job (@Pithikos) Instagram Profilini Görüntüle Tüm eski kapları kaldıran yanıtı ekledim.
Mostafa Ghadimi

7

Durdurulmuş tüm kapları çıkarın.

sudo docker rm $ (sudo docker ps -a -q)

Bu, docker ps -a -q içeren tüm kapların bir listesini alıp kimliklerini docker rm'ye geçirerek durdurulan tüm kapları kaldıracaktır. Bu, çalışan kapsayıcıları kaldırmamalı ve size çalışan bir görüntüyü kaldıramayacağını söyleyecektir.

Etiketlenmemiş tüm resimleri kaldır

Şimdi biraz yer kazanmak için eski görüntüleri temizlemek istiyorsunuz.

sudo docker rmi $ (sudo docker görüntüleri -q --filter "dangling = true")


-V seçeneğini belirterek docker birimlerini silmeyi unutmayın (sudo docker rm -v $ (sudo docker ps -a -q))
vcarel

Buna bakmadım, ama sanırım şu şekilde:docker ps -aq | xargs docker rm -v
quine

Bu yalnızca Windows üzerinde değil Linux'ta çalışır ... Ancak docker rm -f $(docker ps -a -q)Windows için PowerShell / Docker'da çalışır.
Peter Mortensen

6

Yeni yol: hile spotify / docker-gc oynamak.

 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc
  • Bir saatten uzun bir süre önce çıkış yapan kaplar kaldırılır.
  • Bundan sonra kalan kapsayıcıya ait olmayan resimler kaldırıldı

Çevresel ayarları destekledi

Birden fazla etiketi olan görüntülerin silinmesini zorlama

 FORCE_IMAGE_REMOVAL=1

Konteynerlerin silinmesini zorlamak

 FORCE_CONTAINER_REMOVAL=1 

Son Çıkmış Konteynerleri ve Görüntüleri Çöp Toplamadan Hariç Tutma

 GRACE_PERIOD_SECONDS=86400

Bu ayar aynı zamanda GRACE_PERIOD_SECONDS saniyeden daha kısa bir süre önce oluşturulmuş görüntülerin kaldırılmasını da önler.

Kuru çalışma

 DRY_RUN=1

Artık konteyner hacmini temizleme CLEAN_UP_VOLUMES = 1

Referans: docker-gc

Eski yöntem:

eski, çalışmayan kapsayıcıları sil

 docker ps -a -q -f status=exited | xargs --no-run-if-empty docker rm
             OR 
 docker rm $(docker ps -a -q)

çalışmayan docker kaplarıyla ilişkili tüm resimleri sil

 docker images -q | xargs --no-run-if-empty docker rmi

docker sürüm 1.10.x ve üstü için artık yetim docker birimlerini temizleme

 docker volume ls -qf dangling=true | xargs -r docker volume rm

Zaman aralığına göre

 docker ps -a | grep "weeks ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
 docker ps -a | grep "days ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
 docker ps -a | grep "hours ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm

1
İlginç bir alternatif. +1
VonC

6
  1. Tüm liman işleyici işlemlerini kaldırın:

    docker rm $(docker ps -a -q)
    
  2. Belirli bir kabı çıkarın:

    $ docker ps -a (lists all old containers)
    
    $ docker rm container-Id
    


4
#!/bin/bash
# docker-gc --- Remove stopped docker containers

RUNNING=$(docker ps -q)
ALL=$(docker ps -a -q)

for container in $ALL ; do
    [[ "$RUNNING" =~ "$container" ]] && continue
    echo Removing container: $(docker rm $container)
done

kendileri aramak istemeyenler için github.com/spotify/docker-gc
grim

Mükemmel. Aynı işlevselliğe sahip bir cevap da yazdım.
Mostafa Ghadimi

3

Her zaman docker rmi $(docker ps -a -q)tüm resimleri kaldırmak için kullanıyorum .

Başarısız /var/lib/docker/grapholduğunda dizini kaldırabilirsiniz docker rmi.


/ Var / lib / docker / grafik bilgilerini eklediğiniz için teşekkür ederiz
Jonathan DeMarks

Sorular, görüntülerin değil, kapların nasıl kaldırılacağıydı.
pauk960

3

Yalnızca durdurulan kapları kaldırabilirsiniz. Başlangıçta hepsini durdur

docker stop $(docker ps -a -q)

Sonra kaldırabilirsiniz

docker rm $(docker ps -a -q)


3

Kapları ve sarkan görüntüleri temizlemek için bu komutu deneyin.

docker system prune -f

Bu inanılmaz bir profesyonel ipucu!
b01

3

Tüm kapsayıcıları ve resimleri durdurma / kaldırma için temel adımlar

  1. Tüm kapları listele

    docker ps -aq

  2. Çalışan tüm kapları durdurun

    docker stop $(docker ps -aq)

  3. Tüm kapları çıkarın

    docker rm $(docker ps -aq)

  4. Tüm resimleri kaldır

    docker rmi $(docker images -q)

Not: Öncelikle tüm çalışan kapları çıkarmadan önce durdurmanız gerekir. Ayrıca bir görüntüyü kaldırmadan önce, bağımlı kap (lar) ı durdurup çıkarmanız gerekir.


2

İlgilenen herkes için örneği qkrijger'den aldım ve net bir şekilde dönüştürdüm (hepsini durdur ve kaldır)

docker stop `docker ps --no-trunc -aq` ; docker rm `docker ps --no-trunc -aq`

Yine de kapları docker rm -f $(docker ps --no-trunc -aq)
çıkarıyorsanız

Doğru, ancak paylaşılan veya yeniden kullanılan kaynakları (yani Ekli birimler, doğru şekilde kapatılmış etkin bağlantılar, vb.) Büyük bir örnek, bir Jenkins kabınız varsa, o zaman kabı öldürmek kötü bir fikirdir. İstenmeyen değişiklikleri kaydetmesini, oturum açmış kullanıcıları uyarmasını ve en önemlisi tüm derlemeleri düzgün bir şekilde durdurmasını istersiniz.
Kraig McConaghy

kabul etti, bu çok geçerli bir kullanım örneği
qkrijger

2
#!/bin/bash

echo Cleanup unused containers
unused_containers=$(docker ps -a -q --filter="status=exited")
if [[ -n $unused_containers ]]
then
  docker rm $unused_containers
fi

echo Cleanup unused images
unused_images=$(docker images | grep '^<none>' | awk '{print $3}')
if [[ -n $unused_images ]]
then
  docker rmi $unused_images
fi

5
Yanıt verirken, çözümün sadece bir kod dökümünden ziyade ne yaptığı hakkında bir açıklama yapmak en iyisidir, aksi takdirde cevap silinebilir.
AlBlue


2

Kullanıyorum:

docker rm -v $(docker ps -a -q -f status=exited)

çıkan kapsayıcıları silmek ve:

docker rmi -f $(docker images | grep "<none>" | awk "{print \$3}")

tüm etiketsiz görüntülerden kurtulmak için.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.