Jak usunąć stare pojemniki Docker

1235

To pytanie dotyczy pytania Czy należy się martwić o nadmiarowe, niedziałające pojemniki Docker? .

Zastanawiam się, jak usunąć stare pojemniki. docker rm 3e552code34aPozwala usunąć ani jednego, ale mam już dużo. docker rm --helpnie daje opcji wyboru (jak wszystkie lub według nazwy obrazu).

Może jest katalog, w którym przechowywane są te kontenery, w którym mogę je łatwo usunąć ręcznie?

qkrijger
źródło
21
Należy również rozważyć wyczyszczenie osieroconych woluminów dokera. Często stwierdzam, że zajmują dużo więcej miejsca niż stare pojemniki i stare obrazy. Dobry skrypt do usuwania osieroconych woluminów dokerów jest dostępny na stronie: github.com/chadoe/docker-cleanup-volumes .
Nemanja Trifunovic,
Może github.com/chadoe/docker-cleanup-volumes może ci pomóc.
Mihai8
Można również skorzystać docker runz --rmflagą, która stałaby się efemeryczne kontenera, usuwając wszystkie pliki kontenerów po biegu.
Gordon,
12
W oknie dokowanym 1.13 (IV kwartał 2016 r.) Można również rozważyć nowe docker system prunepolecenie. Zobacz moją odpowiedź poniżej .
VonC
1
Użyj narzędzia do zarządzania dokerem Za pomocą tego narzędzia Portainer możemy zarządzać all the old containers, non using volumes and imagesJego prosty interfejs zarządzania dla dokerów Please refer my update below on how to deploy the application
Anish Varghese

Odpowiedzi:

1460

Od wersji Docker 1.13.x można używać przycinania kontenerów Docker :

docker container prune

Spowoduje to usunięcie wszystkich zatrzymanych kontenerów i powinno działać na wszystkich platformach w ten sam sposób.

Istnieje również śliwka systemowa Docker :

docker system prune

który wyczyści wszystkie nieużywane kontenery, sieci, obrazy (zarówno zwisające, jak i niepowiązane) oraz opcjonalnie woluminy, za pomocą jednego polecenia.


W przypadku starszych wersji Dockera możesz łączyć polecenia Docker z innymi poleceniami Unix, aby uzyskać to, czego potrzebujesz. Oto przykład, jak wyczyścić stare pojemniki, które mają tygodnie:

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

Aby przyznać kredyt, tam gdzie jest to należne, ten przykład pochodzi z https://twitter.com/jpetazzo/status/347431091415703552 .

Ken Cochrane
źródło
92
Podobne polecenie, aby usunąć wszystkie nieoznaczone obrazy: docker images | grep "<none>" | awk '{print $3}' | xargs docker rmi
Mohan Raj
7
@ MichelMüller podczas budowania obrazu z pliku dokowania można określić -rmopcję usuwania kontenerów pośrednich po pomyślnej kompilacji.
Freek Kalter
3
@ MichelMüller obrazy służą do buforowania, więc usunięcie kontenerów nie wpłynie na to.
Ken Cochrane
7
Jeśli chcesz użyć awk do tego, rozważ to polecenie, jeśli chcesz zrobić rm wszystkie zatrzymane kontenery (bez błędu z powodu pierwszego wiersza):docker ps -a | awk 'NR > 1 {print $1}' | xargs docker rm
masi
3
To powinno być zaktualizowane polecenie usuwania nieoznaczonych obrazówdocker rmi $(docker images -q -f dangling=true)
Ghjnut,
626

Inna metoda, którą otrzymałem od Guillaume J. Charmes (kredyt, gdzie jest to należne):

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

usunie wszystkie pojemniki w elegancki sposób.

Bartosz Bilicki dla systemu Windows:

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

W przypadku programu PowerShell:

docker rm @(docker ps -aq)

Aktualizacja z Docker 1.13 (IV kwartał 2016), uznanie dla VonC ( później w tym wątku ):

docker system prune usunie WSZYSTKIE nieużywane dane (tj. w kolejności: pojemniki zatrzymane, woluminy bez pojemników i obrazy bez pojemników).

Zobacz PR 26108 i zatwierdź 86de7c0 , które wprowadzają kilka nowych poleceń, aby ułatwić wizualizację ilości miejsca, jaką dane demona Docker zajmuje na dysku i pozwalając na łatwe usunięcie „niepotrzebnego” nadmiaru.

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
qkrijger
źródło
11
to jakoś nie działa dla mnie, ale docker ps -a -q | xargs docker rmdziała, (sudo może być potrzebne)
FUD
86
co docker rm $(docker ps -a -q)?
qkrijger
8
@qkrijger, to nie zmienia niczego od twojej oryginalnej odpowiedzi, z wyjątkiem dodawania bashizmu. Problem dotyczy przepełnienia wiersza poleceń. Wariant xargs radzi sobie z tym w przyjemny sposób. Dodałbym także --no-trunk do dokera ps, aby uniknąć (mało prawdopodobnych) kolizji identyfikatorów.
Ihor Kaharlichenko
8
pamiętaj, że jeśli użyjesz tylko kontenera danych, to również je usunie
Dzung Nguyen
4
Nie widzę sensu, --no-truncponieważ i docker rmtak nie potrzebuje pełnych dokumentów tożsamości.
Pithikos,
411

Zaktualizowana odpowiedź Użyj docker system prunelub docker container pruneteraz. Zobacz zaktualizowaną odpowiedź VonC .

Poprzednia odpowiedź Składając się z kilku różnych wskazówek powyżej, najbardziej eleganckim sposobem na usunięcie wszystkich niedziałających pojemników wydaje się:

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

  • -q drukuje tylko identyfikatory kontenera (bez nagłówków kolumn)
  • -f pozwala filtrować listę wydrukowanych pojemników (w tym przypadku filtrujemy, aby pokazać tylko opuszczone pojemniki)
Ryan Walls
źródło
7
To powinna być poprawna odpowiedź, ponieważ polega ona na oknie dokowanym, które powie ci, które kontenery nie są już używane, zamiast zakładać, że format wyjściowy tekstu $ (obrazy dokera) się nie zmieni. Punkty bonusowe za spawnowanie tylko jednego dodatkowego procesu zamiast dwóch.
eurythmia
18
Może chcesz dodać -vdo uniknięcia zwisające tomy: docker rm -v $(docker ps -q -f status=exited). Zobacz docs.docker.com/userguide/dockervolumes/…, aby uzyskać szczegółowe informacje na temat wiszących woluminów.
rubauba
@rluba najwyraźniej w Docker 1.9 będzie miał osobny interfejs API do obsługi tego problemu. github.com/docker/docker/pull/14242
Ryan Walls
przydatny może być alias:alias docker-gc="docker rm -v \$(docker ps -q -f status=exited)"
Frank Neblung
W przeciwieństwie do odpowiedzi oznaczonej jako poprawna, odpowiedź @RyanWalls działa na OSX, a także jest bardziej zwięzła.
Ray
255

Oficjalny sposób to:

docker rm `docker ps -aq`

Opiekunowie Dockera wskazali, że nie będzie na to żadnego polecenia - a ty skomponujesz takie polecenia:

Omówiliśmy to wcześniej i wolimy, aby użytkownicy korzystali z powyższej linii bez konieczności dodawania dodatkowego kodu do Dockera.

Michael Neale
źródło
6
Jest to jednak złe rozwiązanie, ponieważ spowoduje również usunięcie pojemników pamięci.
Sobrique,
8
Co masz na myśli mówiąc „pojemniki do przechowywania”? Jeśli masz na myśli kontenery tylko z danymi, które kiedyś były używane do przechowywania odniesień do woluminów danych, nie są one już konieczne ze względu na dostępność docker volumepodkomendy i nazwanych woluminów.
L0j1k
Zauważ, że to nie zadziała w Windows PowerShell. W tym celu jest to lepsze rozwiązanie: stackoverflow.com/a/23674294/1150683
Bram Vanroy
@Sobrique Jeśli nie zareagujesz, przynajmniej powinieneś usunąć swój komentarz, jest to prawie kompletny i szkodliwy nonsens.
peterh - Przywróć Monikę
128

Dzięki Docker 1.13 (IV kwartał 2016 r.) Masz teraz:

docker system prune -a usunie WSZYSTKIE nieużywane dane (tj. w kolejności: pojemniki zatrzymane, woluminy bez pojemników i obrazy bez pojemników).

docker system prunenie będzie -a usuwania (dla obrazów) zwisające tylko zdjęć lub bez znacznika, co powiedział w smilebomb .

Zobacz PR 26108 i zatwierdź 86de7c0 , które wprowadzają kilka nowych poleceń, aby ułatwić wizualizację ilości miejsca, jaką dane demona Docker zajmuje na dysku i pozwalając na łatwe usunięcie „niepotrzebnego” nadmiaru.

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

Jak komentuje wjv ,

Istnieje również docker {container,image,volume,network} prunemożliwość usunięcia nieużywanych wystąpień tylko jednego typu obiektu.

Wprowadzone w commit 913e5cb , tylko dla Docker 1.13+.

docker container prune
VonC
źródło
Dzięki za udostępnienie - aby stało się to widoczne, cytuję cię w odpowiedzi wysoko w wątku
qkrijger
Jak zwykle dodaj -fflagę, aby wymusić czyszczenie bez zadawania pytań.
Dirk
3
należy oznaczyć jako poprawną odpowiedź w dzisiejszych czasach, większość z nich była w przeszłość, ale są nadmiernie skomplikowane
Eugen Mayer,
Uzgodnione, ostatnio znacznie łatwiejsze, do góry!
Maxim Geerinck
Opis w bloku kodu służy do docker system prune -ausuwania nieużywanych obrazów. docker system pruneusuwa tylko wiszące obrazy lub obrazy bez znacznika.
smilebomb
104

Można teraz używać filtrowania za pomocą docker ps:

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

I dla zdjęć :

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

Jednak każdy z nich spowoduje błąd docker rmlub spowoduje docker rmizgłoszenie błędu, gdy nie będzie pasujących pojemników. Starsza docker rm $(docker ps -aq)sztuczka była jeszcze gorsza, ponieważ próbowała usunąć każdy działający pojemnik, zawodząc przy każdym z nich.

Oto skrypt czystsze dodać w twojej ~/.bashrclub ~/.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
}

Edycja: Jak zauważono poniżej, oryginalna odpowiedź dotyczyła usuwania obrazów, a nie pojemników. Zaktualizowano, aby odpowiedzieć na oba pytania, w tym nowe linki do dokumentacji. Podziękowania dla Adriana (i odpowiedzi Ryana) za wspomnienie o nowym psfiltrowaniu.

caktux
źródło
2
Zwróć uwagę na prawdziwą zaletę tego - nie zabijasz przypadkowo osób z storageconatiners.
Sobrique,
3
Możesz także użyć, status=createdaby uzyskać te, które nie są uruchomione i nigdy nie działały.
kraina krańców
96

AKTUALIZACJA 2019 (NAJNOWSZY)

docker container prune

W ten sposób - 2017 (OLD)

Aby usunąć WSZYSTKIE ZATRZYMANE POJEMNIKI

docker rm $(docker ps -a -q)

Aby usunąć WSZYSTKIE POJEMNIKI (ZATRZYMANE I NIEZATRZYMANE)

docker rm  -f $(docker ps -a -q)
Levi
źródło
3
przegłosowano, ponieważ z pewnością nie jest to sposób, w jaki robisz to w 2017 r. - to znaczy docker volume/container/image prune, patrz stackoverflow.com/a/39860665/3625317
Eugen Mayer
6
głosowałem za odrzuceniem opinii negatywnej, ponieważ a) odpowiedź pochodziła z 2016 r., i b) wielu ludzi nie bawi się z krwawiącą przewagą.
zapalony
49

Usuń wszystkie zatrzymane pojemniki:

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

Z komentarza pauk960 :

Od wersji 1.3.0 można korzystać z filtrów docker ps, zamiast grep Exitedużycia docker ps -a -f status=exited. A jeśli użyjesz -qgo, możesz uzyskać tylko identyfikatory kontenera zamiast pełnego wyjścia, nie musisz do tego używać awk.

Montells
źródło
33

Jeśli nie chcesz usuwać wszystkich kontenerów, możesz wybrać wszystkie kontenery utworzone przed określonym kontem lub po nim za pomocą docker ps --before <container-ID>lub za pomocą docker ps --since <container-ID>. Ta funkcja jest przynajmniej w wersji Docker 0.6.5.

Załóżmy, że opracowałeś swój system, a teraz działa, ale pozostało wiele pojemników. Chcesz usunąć kontenery utworzone przed tą działającą wersją. Określ identyfikator pojemnika roboczego za pomocą docker ps.

Usuń pojemniki utworzone przed innym pojemnikiem

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

Inny przykład. Baza danych jest już uruchomiona w kontenerze Docker. Opracowałeś aplikację do działania na innym kontenerze, a teraz masz wiele niepotrzebnych kontenerów.

Usuń pojemniki utworzone po określonym pojemniku

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

Docker przechowuje kontenery /var/lib/docker/containersw Ubuntu. Myślę, że dodatkowe kontenery nie wyrządzają żadnej innej szkody, ale zajmują miejsce na dysku.

vesako
źródło
32

Aktualizacja: Od wersji Docker 1.13 (wydanej w styczniu 2017 r.) Możesz wydać następujące polecenie, aby wyczyścić zatrzymane kontenery, nieużywane woluminy, wiszące obrazy i nieużywane sieci:

docker system prune

Jeśli chcesz mieć pewność, że usuwasz tylko kontenery o exitedstatusie, użyj tego:

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

Podobnie, jeśli czyścisz dokery, możesz pozbyć się nieoznaczonych, nienazwanych obrazów w ten sposób:

docker images -q --no-trunc -f dangling=true | xargs docker rmi
L0j1k
źródło
22

Oto mój docker-cleanupskrypt, który usuwa nieoznaczone pojemniki i obrazy. Sprawdź źródło wszelkich aktualizacji.

#!/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

Źródło: https://github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanup

niebieskawy
źródło
@BradMurray Thanks! Może ci się również spodobać: github.com/blueyed/dotfiles/commit/…
blueyed
3
Nie działa na OSX z powodu xargs --no-run-if-emptyopcji
caktux
13

Najpierw przestań uruchamiać kontenery przed próbą ich usunięcia

Usuń działające pojemniki

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

Możesz użyć killzamiast stop. W moim przypadku wolę, stopponieważ mam tendencję do ich ponownego uruchamiania zamiast tworzenia nowego za każdym razem, więc staram się je ładnie zamknąć.

Uwaga: próba zatrzymania kontenera spowoduje błąd:

Błąd: Nie można usunąć działającego kontenera, najpierw go zatrzymaj

Usuń wszystkie pojemniki

docker rm $(docker ps -a -q)
Ulises
źródło
11

Usuwanie wszystkich kontenerów z powłoki Windows:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i
Bartosz Bilicki
źródło
Uwzględnię to w mojej odpowiedzi, ponieważ jest to pierwsza strona. Dzięki
qkrijger 17.04.16
„z powłoki Windows” ? Masz na myśli „korzystanie z powłoki Windows (CMD)” ?
Peter Mortensen
10

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

Oczyszczenie dokera

Mała, uniwersalna skorupa, która usuwa:

  • Kontenery, które nie działają więcej niż jeden dzień temu
  • Obrazy, które nie należą do żadnego pozostałego pojemnika

Zamierzają działać jako zadanie crontab

Funkcja

  • Usunie wszystkie <none>:<none>obrazy
  • Jeśli obraz ma wiele odwołań do repo:, usunie wszystkie tagi repo: oprócz uruchomienia kontenera. W rzeczywistości jest to charakter „docker rmi”.
  • Wiele komunikatów o błędach pojawi się na ekranie i możesz zdecydować, 2>/dev/nullczy nie
  • Dowiedz się czegoś od docker-gc i napraw problem (nie można usunąć obrazu, który ma wielokrotne repo: tag)
HardySimpson
źródło
9

Tak więc osobiście polecam to zrobić jako część skryptu wdrażania dla obrazów i kontenerów, zachowując tylko najnowsze n kontenery i obrazy. Oznaczam moje obrazy Dockera tym samym schematem wersji, którego używam, git taga także zawsze otaguję najnowszy obraz Dockera słowem „najnowsze”. Oznacza to, że bez niczego czyszczenia moje obrazy Dockera wyglądają następująco:

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

Teraz oczywiście nie chcę, aby wszystkie moje obrazy (lub pojemniki) wracały do ​​wieczności na wszystkich moich pudełkach produkcyjnych. Chcę tylko 3 lub 4 ostatnie wycofania i pozbyć się wszystkiego innego. Unix's tailjest tutaj twoim najlepszym przyjacielem. Ponieważ docker imagesi docker psoba zamawiają według daty, możemy po prostu tailwybrać wszystkie oprócz trzech najlepszych i usunąć je:

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

Uruchom to wraz ze swoimi skryptami wdrażania (lub lokalnie), aby zawsze mieć tylko wystarczającą liczbę obrazów, aby wygodnie je wycofać, nie zajmując zbyt wiele miejsca ani nie zaśmiecając starych obrazów.

Osobiście trzymam tylko jeden pojemnik na pudełku produkcyjnym w dowolnym momencie, ale możesz zrobić to samo z pojemnikami, jeśli chcesz więcej:

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

Wreszcie, w moim uproszczonym przykładzie, mamy do czynienia tylko z jednym repozytorium na raz, ale jeśli masz więcej, możesz stać się nieco bardziej wyrafinowany z tym samym pomysłem. Powiedzmy, że chcę zatrzymać trzy ostatnie obrazy z some_repo / some_image. Mogę po prostu wymieszać grepi awki być w drodze:

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

Ponownie ten sam pomysł dotyczy pojemników, ale rozumiesz już do tego momentu, więc przestanę podawać przykłady.

Eli
źródło
8

Posługiwać się:

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

Mocno zatrzymuje i usuwa wszystkie pojemniki znajdujące się lokalnie.

Shashank G.
źródło
Edytuj, podając więcej informacji. Odradzane są tylko kody i odpowiedzi „wypróbuj to”, ponieważ nie zawierają one treści, które można przeszukiwać, i nie wyjaśniają, dlaczego ktoś powinien „wypróbować”. Staramy się być tutaj zasobem wiedzy.
Brian Tompsett - 汤 莱恩
W Ubuntu 16.04 doker wymaga sudo, więc musisz pisać sudo docker rm -f $(sudo docker ps -a -q).
Elliott
co więcej, działa to również w systemie Windows w PowerShell!
Robert Ivanc
@Elliott Myślę, że sudojest wymagany wszędzie, chyba że dodasz użytkownika do grupy „dokerów”. Używam Ubuntu 16.10 bez sudo, dodając mojego użytkownika do grupy dokerów.
emory
7

Usuń 5 najstarszych pojemników:

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

Sprawdź, ile pozostało pojemników:

docker ps -aq | wc -l
Pithikos
źródło
Dobra robota @Pithikos. Dodałem odpowiedź, która usuwa wszystkie stare pojemniki.
Mostafa Ghadimi,
7

Usuń wszystkie zatrzymane pojemniki.

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

Spowoduje to usunięcie wszystkich zatrzymanych kontenerów poprzez pobranie listy wszystkich kontenerów z dokerem ps -a -q i przekazanie ich identyfikatorów do docker rm. Nie powinno to usuwać żadnych działających kontenerów i informuje, że nie można usunąć działającego obrazu.

Usuń wszystkie nieoznaczone obrazy

Teraz chcesz wyczyścić stare obrazy, aby zaoszczędzić trochę miejsca.

sudo docker rmi $ (obrazy sudo docker -q --filter "dangling = true")

Ric_Harvey
źródło
Nie zapomnij usunąć woluminów dokujących, określając opcję -v (sudo docker rm -v $ (sudo docker ps -a -q))
vcarel
Nie szukałem tego, ale wydaje mi się, że to samo:docker ps -aq | xargs docker rm -v
quine
Działa to tylko w systemie Linux, a nie Windows ... Ale docker rm -f $(docker ps -a -q)działa w PowerShell / Docker dla Windows.
Peter Mortensen
6

Nowy sposób: spotify / docker-gc zagraj w lewę.

 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc
  • Pojemniki, które opuściły ponad godzinę temu, są usuwane.
  • Obrazy, które nie należą do żadnego pozostałego pojemnika po tym, są usuwane

Obsługuje ustawienia środowiskowe

Wymuszając usunięcie zdjęć, które mają wiele znaczników

 FORCE_IMAGE_REMOVAL=1

Wymuszając usunięcie pojemników

 FORCE_CONTAINER_REMOVAL=1 

Z wyłączeniem ostatnio opuszczonych pojemników i obrazów z wywozu śmieci

 GRACE_PERIOD_SECONDS=86400

To ustawienie zapobiega również usuwaniu obrazów, które zostały utworzone mniej niż GRACE_PERIOD_SECONDS sekund temu.

Próba

 DRY_RUN=1

Czyszczenie osieroconych pojemników CLEAN_UP_VOLUMES = 1

Odniesienie: docker-gc

Stary sposób:

usuń stare, niedziałające pojemniki

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

usuń wszystkie obrazy związane z niedziałającymi kontenerami dokerów

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

czyszczenie osieroconych woluminów dokera dla wersji dokowanej 1.10.xi wyższej

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

Na podstawie okresu

 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
f-społeczeństwo
źródło
1
Ciekawa alternatywa. +1
VonC
6
  1. Usuń wszystkie procesy dokera:

    docker rm $(docker ps -a -q)
    
  2. Usuń określony pojemnik:

    $ docker ps -a (lists all old containers)
    
    $ docker rm container-Id
    
padakpadak
źródło
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
McKoss
źródło
dla tych, którzy sami nie chcą ich szukać github.com/spotify/docker-gc
ponury
Jest idealny. Mam również odpowiedź, która ma tę samą funkcjonalność.
Mostafa Ghadimi,
3

Zawsze używam docker rmi $(docker ps -a -q)do usuwania wszystkich zdjęć.

Możesz usunąć katalog, /var/lib/docker/graphgdy się docker rminie powiedzie.

słoneczny
źródło
Dziękujemy za dodanie informacji / var / lib / docker / graph
Jonathan DeMarks
Pytania dotyczyły sposobu usuwania pojemników, a nie obrazów.
pauk960,
3

Możesz usunąć tylko zatrzymane pojemniki. Zatrzymaj je wszystkie na początku

docker stop $(docker ps -a -q)

Następnie możesz usunąć

docker rm $(docker ps -a -q)

Marcin Szymczak
źródło
3

Wypróbuj to polecenie, aby wyczyścić pojemniki i wiszące obrazy.

docker system prune -f
Kumpel
źródło
To niesamowity pro-tip!
b01
3

Podstawowe kroki, aby zatrzymać / usunąć wszystkie pojemniki i obrazy

  1. Wyświetl wszystkie pojemniki

    docker ps -aq

  2. Zatrzymaj wszystkie działające pojemniki

    docker stop $(docker ps -aq)

  3. Usuń wszystkie pojemniki

    docker rm $(docker ps -aq)

  4. Usuń wszystkie obrazy

    docker rmi $(docker images -q)

Uwaga: Najpierw musisz zatrzymać wszystkie działające pojemniki, zanim je usuniesz. Również przed usunięciem obrazu musisz zatrzymać i usunąć zależne od niego pojemniki.

Murali Manchadikkal
źródło
2

Dla wszystkich zainteresowanych wziąłem przykład z qkrijger i zmieniłem go w opcję wyczyść wszystko (zatrzymaj i usuń wszystko)

docker stop `docker ps --no-trunc -aq` ; docker rm `docker ps --no-trunc -aq`
Kraig McConaghy
źródło
Jeśli i tak wyjmujesz pojemniki, docker rm -f $(docker ps --no-trunc -aq)jest to szybsze
qkrijger 10.04.15
To prawda, ale jeśli potrzebujesz przejść przez odpowiednie zamknięcie w celu wyczyszczenia współużytkowanych lub ponownie wykorzystywanych zasobów (tj. Dołączonych woluminów, poprawnie zamkniętych aktywnych połączeń itp.), Musisz najpierw wywołać stop. Świetny przykład, jeśli masz pojemnik Jenkins, zabicie go to zły pomysł. Chcesz, aby zapisywał wszelkie zmiany bez oporu, ostrzegał zalogowanych użytkowników i, co bardzo ważne, właściwie zatrzymywał wszystkie kompilacje.
Kraig McConaghy
zgodził się, że jest to bardzo ważny przypadek użycia
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
AleX
źródło
5
Kiedy odpowiadasz, najlepiej wyjaśnić, co robi rozwiązanie, a nie tylko zrzut kodu, w przeciwnym razie odpowiedź może zostać usunięta.
AlBlue
2
docker rm --force `docker ps -qa`
Sivalingam
źródło
2

Używam:

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

aby usunąć opuszczone kontenery i:

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

aby pozbyć się wszystkich nieoznaczonych obrazów.

Alexandru Bantiuc
źródło