Opriți și eliminați toate containerele docker [închis] (Programare, Docker)

jjbskir a intrebat.

Care este cea mai bună modalitate de a crea o tabula rasa cu containerele Docker? De multe ori simt că este mai ușor să încep de la zero, dar am o grămadă de containere de care nu sunt sigur care sunt stările lor, apoi, atunci când rulează docker rm nu mă lasă, deoarece containerul docker ar putea fi încă în uz.

Comentarii

  • Posibil duplicat al articolului Cum se elimină containerele Docker vechi –  > Por DarkCygnus.
  • Da, nu sunt sigur dacă este un duplicat sau nu. Întrebarea pe care ai postat-o este despre ștergerea containerelor vechi, în timp ce ceea ce vreau să știu este cum să șterg pur și simplu totul, indiferent de cât de vechi este. Dar există o suprapunere def. –  > Por jjbskir.
  • Întrebarea legată sigur cere containere vechi, dar soluția se aplică la orice container pe care îl specificați. Deci, ați putea adapta acea altă soluție la cazul dvs.  > Por DarkCygnus.
10 răspunsuri
John Kuriakose

Opriți toate containerele

docker stop $(docker ps -a -q)

Îndepărtați toate containerele

docker rm $(docker ps -a -q)

Găsiți mai multe comenzi aici

Comentarii

  • steguleț necunoscut: ‘a’ în -a –  > Por Akmal Salikhov.
  • Acest lucru funcționează și în Powershell. –  > Por sashoalm.
Eugen Mayer

Docker a introdus noi spații de nume și comenzi pe care toată lumea ar trebui să le învețe în cele din urmă și să nu rămână la vechile obiceiuri. Iată documentația, , iar aici sunt câteva exemple:

Ștergerea containerelor care nu mai sunt necesare (oprit)

docker container prune

Ștergerea imaginilor care nu mai sunt necesare

ceea ce înseamnă că se șterg numai imaginile care nu sunt etichetate și nu sunt indicate de „latest” – deci nu sunt șterse imaginile reale pe care le puteți utiliza în mod regulat.

docker image prune

Ștergerea tuturor volumelor care nu sunt utilizate de niciun container existent

( chiar și containerele oprite solicită volume ). Acest lucru curăță, de obicei, volumele anonime atârnate ale containerelor care au fost șterse cu mult timp în urmă. Nu ar trebui să șteargă niciodată volumele numite, deoarece containerele acestora ar trebui să existe / să funcționeze.Aveți grijă, asigurați-vă că cel puțin stiva dvs. funcționează înainte de a trece la această operațiune

docker volume prune

Același lucru pentru rețelele nefolosite

docker network prune

Și, în final, dacă doriți să scăpați de tot gunoiul – pentru a vă asigura că nu se întâmplă nimic cu producția dumneavoastră, asigurați-vă că toate stivele sunt în curs de execuție și apoi rulați

docker system prune

Comentarii

  • docker system prun spre ultima este lipsit un e –  > Por Ayushya.
  • IMO docker system prune este adevăratul răspuns la această întrebare.  > Por ndm13.
Alex Nolasco

Putem realiza acest lucru cu o singură linie (elimină, de asemenea, containerele în execuție)

docker container rm $(docker container ls -aq) -f

Ce face

docker container ls -aq listează doar ID-urile containerelor

docker container rm $(..) -f elimină forțat toate ID-urile containerelor

Chris

Iată un gist bun pe care îl folosesc pentru acest tip de lucru: Din acest link pe care oamenii par să nu-l placă (https://gist.github.com/bastman/5b57ddb3c11942094f8d0a97d461b430)

ștergeți volumele

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

ștergeți rețelele

$ docker network ls  
$ docker network ls | grep "bridge"   
$ docker network rm $(docker network ls | grep "bridge" | awk '/ / { print $1 }')

eliminați imaginile docker

// vezi: http://stackoverflow.com/questions/32723111/how-to-remove-old-and-unused-docker-images

$ docker images
$ docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
$ docker images | grep "none"
$ docker rmi $(docker images | grep "none" | awk '/ / { print $3 }')

eliminați containerele docker

// vezi: http://stackoverflow.com/questions/32723111/how-to-remove-old-and-unused-docker-images

$ docker ps
$ docker ps -a
$ docker rm $(docker ps -qa --no-trunc --filter "status=exited")

În esență, doriți să distrugeți toate containerele care rulează, să eliminați toate imaginile, să dezinstalați docker, să reinstalați versiunea dorită, iar acest lucru ar trebui să fie cât se poate de curat.

Comentarii

  • Ați putea să postați comenzile în loc de un simplu link către gist? Acest lucru îi va ajuta foarte mult pe acei utilizatori care nu pot urma link-ul dvs. să beneficieze de răspunsul dvs. De asemenea, într-o bună zi, acel link ar putea fi rupt și, odată cu el, răspunsul dumneavoastră ar putea deveni mai puțin util.  > Por DarkCygnus.
  • Mulțumesc, mi-ați eliminat DV –  > Por DarkCygnus.
  • Totul este în regulă. Încerc doar să dau înapoi comunității, de fapt nu am mai răspuns niciodată la acestea înainte. Cred că toți dezvoltatorii simt chemarea la un moment dat? –  > Por Chris.
  • Asta e minunat @Chris, să-i ajuți pe alții este cu adevărat onorabil, precum și o bună oportunitate de a-ți consolida cunoștințele în domeniu, deoarece scrierea răspunsurilor te determină uneori să înveți mai multe despre acea temă sau să clarifici unele îndoieli vechi pe care le aveai. Trebuie doar să aveți în vedere că răspunsurile dvs. ar trebui să fie clare și să luați în considerare aspecte ca acesta, care sunt necesare pentru răspunsuri bune în SO –  > Por DarkCygnus.
  • downvoted deoarece este masiv depășit. Nu este nevoie de filtru dangling=true any, prune este aici –  > Por Eugen Mayer.
Andriy Tolstoi
docker ps -aq | xargs docker stop | xargs docker rm

sau

docker ps -aq | xargs docker rm -f

Comentarii

  • Vă rugăm să furnizați scurte detalii despre comenzile docker pe care le-ați menționat pentru utilizatori. Detaliile sunt întotdeauna utile mai ales pentru studenți și dezvoltatori juniori. –  > Por Muhammad Tariq.
Travis Reeder

O singură replică:

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

Dacă vrei să faci doar cele care rulează, elimină -a.

Lucas Basquerotto

Dacă sunteți îngrijorat de shellcheck SC2046 (caz în care veți primi un avertisment pentru comanda docker stop $(docker ps -a -q)) și folosiți Bash4+ (pentru a putea folosi comanda mapfile builtin command), puteți rula următoarele pentru a opri toate containerele:

mapfile -t list < <(docker ps -q)
[[ ${#list[@]} -gt 0 ]] && docker container stop "${list[@]}"

Raționamentul:

  • docker ps -q returnează toate ID-urile containerelor active

  • mapfile stochează id-urile containerelor rezultate în fișierul list array

  • [[ ${#list[@]} -gt 0 ]] testează dacă list array are 1 sau mai multe elemente pentru a executa următoarea comandă

  • docker container stop "${list[@]}" oprește toate containerele ale căror id-uri sunt stocate în array. listarray (se va executa numai dacă array-ul are elemente)

În mod similar, pentru a elimina toate containerele oprite:

mapfile -t list < <(docker ps -aq)
[[ ${#list[@]} -gt 0 ]] && docker container rm "${list[@]}"

(docker ps -aq returnează toate ID-urile containerelor, chiar și ale containerelor oprite)

Dacă doriți să opriți și să eliminați toate containerele, puteți rula comenzile de mai sus în mod secvențial (prima dată stop, , apoi rm).

Alternativ, puteți rula doar comenzile pentru a elimina containerele cu rm --force, , dar rețineți că acest lucru va trimite SIGKILL, , astfel încât rularea stopmai întâi și apoi rm este recomandabil (stop trimite SIGTERM, , cu excepția cazului în care se termină, caz în care trimite SIGKILL).

Comentarii

  • Asta pentru a acomoda spațiile din numele containerelor? –  > Por kjones.
  • @kjones Dacă utilizați shellcheck, primiți un avertisment cu unquotted $() deoarece „Când expansiunile de comenzi sunt necotate, vor apărea divizarea cuvintelor și globbing”. În cazul ID-urilor de containere docker nu există o astfel de problemă, așa că puteți să dezactivați regula, dar dacă nu doriți să dezactivați regula, puteți folosi modul alternativ pe care l-am postat. Aceasta face același lucru, deși există mai mult cod, așa că s-ar putea să preferați doar docker stop $(docker ps -a -q), , dar eu încerc să evit ghilimelele necompletate dacă există o alternativă, chiar dacă știu că nu există nicio problemă în acest caz specific. –  > Por Lucas Basquerotto.
  • Înțeleg, vă mulțumesc pentru explicația ulterioară –  > Por kjones.
Pritesh Gohil

atunci când execut docker rm nu mă lasă pentru că containerul docker ar putea fi încă în uz.

Pașii pe care i-aș sugera sunt în următoarea ordine,
1. Încercați să eliminați

docker rm <container-id>

2. Dacă rm nu funcționează, folosiți stop

docker stop <container-id>

3. Stop nu funcționează? încercați kill

docker kill <container-id>

4. stop a funcționat, dar containerul este încă acolo? încercați prune pentru a elimina cu forța toate containerele oprite

docker container prune -f

Rashid Iqbal

opriți containerele:

docker stop container1_id container2_id containerz_id 

delete all image:

docker system prune --all

pvaitonis

În ubuntu am ucis pur și simplu toate procesele atunci când alte soluții nu au funcționat.

$ ps aux | grep docker
$ sudo kill {enter process id here}

Nu vă recomand să faceți acest mod. am fost pe reinstalarea sistemului de operare, când aceste comenzi au salvat ceva timp pentru a rezolva problemele mele cu containerele.

Tags: