Come rimuovere i vecchi contenitori Docker


1235

Questa domanda è correlata a Dovrei essere preoccupato per i contenitori Docker in eccesso, non funzionanti? .

Mi chiedo come rimuovere i vecchi contenitori. Il docker rm 3e552code34aconsente di rimuovere una sola, ma ho già un sacco. docker rm --helpnon fornisce un'opzione di selezione (come tutte o in base al nome dell'immagine).

Forse esiste una directory in cui sono memorizzati questi contenitori in cui posso eliminarli facilmente manualmente?


21
Si dovrebbe anche considerare la pulizia di volumi docker orfani. Trovo spesso che consumano molto più spazio rispetto ai vecchi contenitori e alle vecchie immagini. Un buon script per la rimozione di volumi docker orfani è disponibile su: github.com/chadoe/docker-cleanup-volumes .
Nemanja Trifunovic,


È inoltre possibile utilizzare docker runcon il --rmflag che renderebbe il contenitore effimero, rimuovendo tutti i file del contenitore dopo l'esecuzione.
Gordon,

12
Con la finestra mobile 1.13 (4 ° trimestre 2016), puoi anche considerare il nuovo docker system prunecomando. Vedi la mia risposta qui sotto .
VonC,

1
Utilizza lo strumento di gestione della finestra mobile Portainer Possiamo gestire all the old containers, non using volumes and imagesutilizzando questo strumento È un'interfaccia utente di gestione semplice per le persone portuali Please refer my update below on how to deploy the application
Anish Varghese

Risposte:


1460

Da Docker 1.13.x è possibile utilizzare la prugna contenitore Docker :

docker container prune

Ciò rimuoverà tutti i contenitori arrestati e dovrebbe funzionare su tutte le piattaforme allo stesso modo.

C'è anche una prugna di sistema Docker :

docker system prune

che ripulirà tutti i contenitori, le reti, le immagini (sia penzolanti che non referenziati) inutilizzati e, facoltativamente, i volumi, in un solo comando.


Per le versioni precedenti di Docker, puoi mettere insieme i comandi Docker insieme ad altri comandi Unix per ottenere ciò di cui hai bisogno. Ecco un esempio su come ripulire i vecchi contenitori vecchi di settimane:

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

Per dare credito, dove è dovuto, questo esempio è tratto da https://twitter.com/jpetazzo/status/347431091415703552 .


92
Comando simile per rimuovere tutte le immagini senza tag: docker images | grep "<none>" | awk '{print $3}' | xargs docker rmi
Mohan Raj,

7
@ MichelMüller quando si crea un'immagine da un file docker è possibile specificare l' -rmopzione per rimuovere i contenitori intermedi dopo una compilazione corretta.
Freek Kalter,

3
@ MichelMüller le immagini sono quelle utilizzate per la memorizzazione nella cache, quindi la rimozione dei contenitori non avrà alcun effetto.
Ken Cochrane,

7
Se si desidera utilizzare awk per questo, prendere in considerazione questo comando se si desidera eseguire tutti i contenitori arrestati (senza errori a causa della prima riga):docker ps -a | awk 'NR > 1 {print $1}' | xargs docker rm
masi,

3
Questo dovrebbe essere il comando aggiornato per la rimozione di immagini senza docker rmi $(docker images -q -f dangling=true)
tag

626

Un altro metodo, che ho ottenuto da Guillaume J. Charmes (credito dove è dovuto):

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

rimuoverà tutti i contenitori in modo elegante.

E di Bartosz Bilicki, per Windows:

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

Per PowerShell:

docker rm @(docker ps -aq)

Un aggiornamento con Docker 1.13 (Q4 2016), credito a VonC ( più avanti in questo thread ):

docker system prune eliminerà TUTTI i dati non utilizzati (ovvero, nell'ordine: contenitori fermi, volumi senza contenitori e immagini senza contenitori).

Vedi PR 26108 e impegna 86de7c0 , che sta introducendo alcuni nuovi comandi per facilitare la visualizzazione della quantità di spazio che i dati del daemon Docker stanno occupando sul disco e consentendo di ripulire facilmente l'eccesso "non necessario".

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
questo in qualche modo non funziona per me, ma docker ps -a -q | xargs docker rmfunziona, (potrebbe essere necessario sudo)
FUD

86
che dire docker rm $(docker ps -a -q)?
qkrijger,

8
@qkrijger, questo non cambia nulla dalla tua risposta originale, tranne per l'aggiunta di bashismo. Il problema è con overflow della riga di comando. La variante xargs la gestisce in modo piacevole. Vorrei anche aggiungere --no-trunk a docker ps per evitare (probabilmente) scontri di identificazione.
Ihor Kaharlichenko,

8
fai attenzione se usi un contenitore di soli dati, li rimuoverà anche
Dzung Nguyen,

4
Non vedo il punto con --no-truncpoiché docker rmnon necessita comunque di ID completi.
Pithikos,

411

Risposta aggiornata Usa docker system pruneo docker container pruneora. Vedi la risposta aggiornata di VonC .

Risposta precedente Comporre diversi suggerimenti di cui sopra, il modo più elegante per rimuovere tutti i contenitori non in esecuzione sembra essere:

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

  • -q stampa solo gli ID contenitore (senza intestazioni di colonna)
  • -f ti permette di filtrare la tua lista di contenitori stampati (in questo caso stiamo filtrando per mostrare solo i contenitori usciti)

7
Questa dovrebbe essere la risposta corretta perché si basa sulla finestra mobile per dirti quali contenitori non vengono più utilizzati, anziché assumere che il formato di output del testo di $ (immagini della finestra mobile) non cambierà. Punti bonus per la generazione di un solo processo aggiuntivo anziché due.
Euritmia,

18
Si potrebbe desiderare di aggiungere -vper evitare penzoloni volumi: docker rm -v $(docker ps -q -f status=exited). Vedi docs.docker.com/userguide/dockervolumes/… per dettagli sui volumi sospesi.
rluba,

Apparentemente @rluba in Docker 1.9 ci sarà un api di volume separato per gestire quel problema. github.com/docker/docker/pull/14242
Ryan Walls

un alias potrebbe essere utile:alias docker-gc="docker rm -v \$(docker ps -q -f status=exited)"
Frank Neblung,

A differenza della risposta contrassegnata come corretta, la risposta di @RyanWalls funziona su OSX oltre ad essere più concisa.
Ray,

255

Il modo ufficiale è:

docker rm `docker ps -aq`

I manutentori Docker hanno indicato che non ci sarà alcun comando per questo - e componi i comandi in questo modo:

Ne abbiamo discusso in precedenza e preferiamo che gli utenti utilizzino la riga precedente senza dover aggiungere codice aggiuntivo a Docker.


6
Questa è una cattiva soluzione, perché eliminerà anche i contenitori di archiviazione.
Sobrique,

8
Cosa intendi per "contenitori di stoccaggio"? Se si intendono contenitori di soli dati che una volta venivano utilizzati per conservare i riferimenti ai volumi di dati, questi non sono più necessari a causa della disponibilità del docker volumesottocomando e dei volumi denominati.
L0j1k,

Nota che questo non funzionerà con Windows Powershell. Per questo, questa è una soluzione migliore: stackoverflow.com/a/23674294/1150683
Bram Vanroy

@Sobrique Se non reagisci, almeno dovresti eliminare il tuo commento, è una sciocchezza quasi completa e dannosa.
Peter - Ripristina Monica il

128

Con Docker 1.13 (Q4 2016), ora hai:

docker system prune -a eliminerà TUTTI i dati non utilizzati (ovvero, nell'ordine: contenitori fermi, volumi senza contenitori e immagini senza contenitori).

docker system prunesenza -a rimuoverà (per le immagini) solo immagini pendenti o immagini senza tag, come commentato da smilebomb .

Vedi PR 26108 e impegna 86de7c0 , che sta introducendo alcuni nuovi comandi per facilitare la visualizzazione della quantità di spazio che i dati del daemon Docker stanno occupando sul disco e consentendo di ripulire facilmente l'eccesso "non necessario".

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

Come commenta wjv ,

C'è anche docker {container,image,volume,network} prune, che può essere usato per rimuovere istanze inutilizzate di un solo tipo di oggetto.

Introdotto in commit 913e5cb , solo per Docker 1.13+.

docker container prune

Grazie per aver condiviso - perché questo diventi visibile, ti sto citando nella risposta in alto nella discussione
qkrijger

Come al solito, aggiungi la -fbandiera per forzare la pulizia senza fare domande.
Dirk,

3
dovrebbe essere contrassegnato come la risposta corretta ai giorni nostri, la maggior parte di quanto sopra era tornato indietro nel tempo, ma oggi sono troppo complicati
Eugen Mayer,

D'accordo, molto più facile ultimamente, su su, vai!
Maxim Geerinck,

La descrizione nel blocco di codice è per docker system prune -a, che rimuove le immagini non utilizzate. docker system prunerimuove solo immagini penzolanti o immagini senza tag.
smilebomb,

104

Ora è possibile usare filtro con docker ps:

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

E per immagini :

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

Tuttavia, uno qualsiasi di questi causerà docker rmo genererà docker rmiun errore quando non ci sono contenitori corrispondenti. Il docker rm $(docker ps -aq)trucco più vecchio è stato anche peggio in quanto ha cercato di rimuovere qualsiasi contenitore in esecuzione, fallendo in ciascuno di essi.

Ecco uno script più pulito da aggiungere nel tuo ~/.bashrco~/.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
}

Modifica: come indicato di seguito, la risposta originale era per la rimozione di immagini, non di contenitori. Aggiornato per rispondere a entrambi, compresi nuovi collegamenti alla documentazione. Grazie ad Adrian (e alla risposta di Ryan) per aver menzionato il nuovo psfiltro.


2
Nota il vero vantaggio di questo: non uccidi accidentalmente i storageconatiner.
Sobrique,

3
È inoltre possibile utilizzare status=createdper ottenere quelli che non sono in esecuzione e che non hanno mai eseguito.
Enderland,

96

AGGIORNATO 2019 (PIÙ RECENTE)

docker container prune

Questo - 2017 (VECCHIO) modo

Per rimuovere TUTTI I CONTENITORI FERMATI

docker rm $(docker ps -a -q)

Per rimuovere TUTTI I CONTENITORI (FERMATO E NON FERMATO)

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

3
downvoted, poiché questo è di sicuro non è il modo di fare che nel 2017 - whis sarebbero docker volume/container/image prune, vedi stackoverflow.com/a/39860665/3625317
Eugen Mayer

6
votato per contrastare il downvote perché a) questa risposta è stata del 2016 eb) molte persone non corrono il limite.
appassionato

49

Rimuovi tutti i contenitori fermati:

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

Dal commento di pauk960 :

Dalla versione 1.3.0 è possibile utilizzare i filtri docker psinvece di grep Exitedutilizzare docker ps -a -f status=exited. E se lo usi -qcon esso puoi ottenere solo gli ID contenitore anziché l'output completo, non è necessario usare awk per questo.


33

Se non si desidera rimuovere tutti i contenitori, è possibile selezionare tutti i contenitori creati prima o dopo un contenitore specifico con docker ps --before <container-ID>o condocker ps --since <container-ID> . Questa funzione è almeno nella versione Docker 0.6.5.

Supponiamo che tu abbia sviluppato il tuo sistema e ora funzioni, ma sono rimasti alcuni container. Vuoi rimuovere i contenitori creati prima di quella versione funzionante. Determinare l'ID del contenitore di lavoro con docker ps.

Rimuovere i contenitori creati prima di un altro contenitore

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

Un altro esempio. Il database è già in esecuzione su un contenitore Docker. Hai sviluppato l'applicazione per l'esecuzione su un altro contenitore e ora hai un numero di contenitori non necessari.

Rimuovere i contenitori creati dopo un determinato contenitore

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

Docker memorizza i contenitori /var/lib/docker/containersin Ubuntu. Penso che contenitori extra non facciano altro danno, ma occupano spazio su disco.


32

Aggiornamento: a partire dalla versione 1.13 di Docker (rilasciata a gennaio 2017), è possibile emettere il comando seguente per ripulire i contenitori arrestati, i volumi non utilizzati, le immagini sospese e le reti non utilizzate:

docker system prune

Se vuoi assicurarti di eliminare solo i contenitori con uno exitedstato, usa questo:

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

Allo stesso modo, se stai pulendo roba docker, puoi sbarazzarti di immagini senza tag e senza nome in questo modo:

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

22

Ecco la mia docker-cleanupsceneggiatura, che rimuove contenitori e immagini senza tag. Si prega di controllare la fonte per eventuali aggiornamenti.

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

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


@BradMurray Grazie! Potrebbero interessarti anche questi: github.com/blueyed/dotfiles/commit/…
blueyed

3
Non funziona su OSX a causa xargs --no-run-if-emptydell'opzione
caktux

13

Innanzitutto, interrompere l'esecuzione dei contenitori prima di tentare di rimuoverli

Rimuovere i contenitori in esecuzione

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

È possibile utilizzare killinvece di stop. Nel mio caso preferisco stopdato che tendo a rieseguirli piuttosto che crearne uno nuovo ogni volta, quindi provo a spegnerli bene.

Nota: il tentativo di arrestare un contenitore genererà un errore:

Errore: impossibile rimuovere un contenitore in esecuzione, per favore fermalo prima

Rimuovere tutti i contenitori

docker rm $(docker ps -a -q)

11

Rimozione di tutti i contenitori dalla shell di Windows:

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

Includerò questo nella mia risposta poiché quella è la prima pagina. Grazie
qkrijger,

"dalla shell di Windows" ? Intendi "usare la shell di Windows (CMD)" ?
Peter Mortensen,

10

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

Pulizia della finestra mobile

Una piccola shell all-in-one, che rimuove:

  • Contenitori che non funzionano più di un giorno fa
  • Immagini che non appartengono a nessun contenitore rimanente

Intenzione di essere eseguito come processo crontab

caratteristica

  • Rimuoverà tutto <none>:<none> immagini
  • Se l'immagine ha più riferimenti repo: tag ad esso, rimuoverà tutto il repo: tag tranne che con l'esecuzione di un contenitore. In realtà è una natura di "docker rmi".
  • Molti messaggi di errore verranno visualizzati sullo schermo e puoi decidere di farlo 2>/dev/nullo meno
  • Impara qualcosa da docker-gc e risolvi il suo problema (non è possibile rimuovere l'immagine con repository multipli: tag)

9

Quindi, personalmente consiglio di farlo come parte dello script di distribuzione sia per le immagini che per i contenitori, mantenendo solo i n contenitori e le immagini più recenti. Taggo le mie immagini Docker con lo stesso schema di versioning che uso git tage taggando sempre l'ultima immagine Docker con "latest". Ciò significa che senza ripulire nulla, le mie immagini Docker finiscono per apparire come:

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

Ora, ovviamente, non voglio che tutte le mie immagini (o contenitori) tornino alla perfezione su tutte le mie scatole di produzione. Voglio solo gli ultimi 3 o 4 per i rollback e liberarmi di tutto il resto. Unix tailè il tuo migliore amico qui. Da allora docker imagese in docker psentrambi gli ordini per data, possiamo semplicemente usare tailper selezionare tutti tranne i primi tre e rimuoverli:

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

Eseguilo insieme agli script di distribuzione (o localmente) per mantenere sempre le immagini sufficienti per tornare comodamente senza occupare troppo spazio o ingombrare le cose con le vecchie immagini.

Personalmente, tengo solo un contenitore sulla mia scatola di produzione in qualsiasi momento, ma puoi fare lo stesso tipo di cose con i contenitori se vuoi di più:

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

Infine, nel mio esempio semplificato abbiamo a che fare solo con un repository alla volta, ma se ne avessi di più, puoi solo diventare un po 'più sofisticato con la stessa idea. Supponiamo che voglia solo mantenere le ultime tre immagini da some_repo / some_image. Posso solo mescolo in grepe awke per la mia strada:

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

Ancora una volta, la stessa idea si applica ai contenitori, ma a questo punto la capisci, quindi smetterò di dare esempi.


8

Uso:

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

Si arresta e rimuove con forza tutti i contenitori presenti localmente.


Modifica con ulteriori informazioni. Le risposte di solo codice e "prova questo" sono scoraggiate, perché non contengono contenuti ricercabili e non spiegano perché qualcuno dovrebbe "provare questo". Facciamo uno sforzo qui per essere una risorsa per la conoscenza.
Brian Tompsett - 莱恩 莱恩

In Ubuntu 16.04, la finestra mobile richiede sudo, quindi devi scrivere sudo docker rm -f $(sudo docker ps -a -q).
Elliott,

inoltre, questo funziona anche in Windows con PowerShell!
Robert Ivanc,

@Elliott Penso che sudosia richiesto ovunque, a meno che tu non aggiunga il tuo utente al gruppo 'docker'. Uso Ubuntu 16.10 senza sudo aggiungendo il mio utente al gruppo docker.
emory

7

Rimuovi 5 contenitori più vecchi:

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

Vedi quanti contenitori sono rimasti:

docker ps -aq | wc -l

Bel lavoro @Pithikos. Ho aggiunto la risposta che rimuove tutti i vecchi contenitori.
Mostafa Ghadimi,

7

Rimuovere tutti i contenitori fermi.

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

Ciò rimuoverà tutti i contenitori arrestati ottenendo un elenco di tutti i contenitori con la finestra mobile ps -a -q e passando i loro ID alla finestra mobile rm. Questo non dovrebbe rimuovere alcun container in esecuzione e ti dirà che non è possibile rimuovere un'immagine in esecuzione.

Rimuovi tutte le immagini senza tag

Ora vuoi ripulire le vecchie immagini per risparmiare spazio.

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


Non dimenticare di eliminare i volumi della finestra mobile specificando l'opzione -v (sudo docker rm -v $ (sudo docker ps -a -q))
vcarel

Non ho cercato, ma immagino lo stesso di:docker ps -aq | xargs docker rm -v
Quine,

Funziona solo su Linux, non su Windows ... Ma docker rm -f $(docker ps -a -q)funziona su PowerShell / Docker per Windows.
Peter Mortensen,

6

Nuovo modo: spotify / docker-gc gioca il trucco.

 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc
  • I contenitori che sono usciti più di un'ora fa vengono rimossi.
  • Le immagini che non appartengono ad alcun contenitore rimanente dopo che sono state rimosse

Ha supportato le impostazioni ambientali

Forzare la cancellazione di immagini che hanno più tag

 FORCE_IMAGE_REMOVAL=1

Forzare la cancellazione dei contenitori

 FORCE_CONTAINER_REMOVAL=1 

Esclusione di contenitori e immagini usciti di recente dalla raccolta dei rifiuti

 GRACE_PERIOD_SECONDS=86400

Questa impostazione impedisce anche la rimozione di immagini che sono state create meno di GRACE_PERIOD_SECONDS secondi fa.

Funzionamento a secco

 DRY_RUN=1

Pulizia dei volumi dei container orfani CLEAN_UP_VOLUMES = 1

Riferimento: docker-gc

Vecchio modo di fare:

elimina i vecchi contenitori non in esecuzione

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

elimina tutte le immagini associate ai contenitori docker non in esecuzione

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

ripulisce i volumi docker orfani per la versione docker 1.10.xe successive

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

In base al periodo di tempo

 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
Alternativa interessante +1
VonC,

6
  1. Rimuovi tutti i processi docker:

    docker rm $(docker ps -a -q)
    
  2. Rimuovi contenitore specifico:

    $ 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

per coloro che non vogliono cercarlo da soli github.com/spotify/docker-gc
cupo

È perfetto. Ho anche scritto una risposta che ha la stessa funzionalità.
Mostafa Ghadimi,

3

Uso sempre docker rmi $(docker ps -a -q)per rimuovere tutte le immagini.

È possibile rimuovere la directory in /var/lib/docker/graphcaso di docker rmierrore.


Grazie per aver aggiunto le informazioni / var / lib / docker / graph
Jonathan DeMarks il

La domanda era come rimuovere i contenitori, non le immagini.
pauk960,

3

È possibile rimuovere solo i contenitori arrestati. Ferma tutti all'inizio

docker stop $(docker ps -a -q)

Quindi è possibile rimuovere

docker rm $(docker ps -a -q)


3

Prova questo comando per pulire i contenitori e le immagini appese.

docker system prune -f

Questo è un fantastico suggerimento pro!
b01,

3

I passaggi di base per arrestare / rimuovere tutti i contenitori e le immagini

  1. Elencare tutti i contenitori

    docker ps -aq

  2. Interrompere tutti i contenitori in esecuzione

    docker stop $(docker ps -aq)

  3. Rimuovere tutti i contenitori

    docker rm $(docker ps -aq)

  4. Rimuovi tutte le immagini

    docker rmi $(docker images -q)

Nota: in primo luogo è necessario arrestare tutti i contenitori in esecuzione prima di rimuoverli. Inoltre, prima di rimuovere un'immagine, è necessario arrestare e rimuovere i relativi contenitori dipendenti.


2

Per chiunque sia interessato, ho preso l'esempio da qkrijger e l'ho trasformato in un tutto chiaro (ferma e rimuovi tutto)

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

Se stai rimuovendo comunque i contenitori, allora docker rm -f $(docker ps --no-trunc -aq)è più veloce
qkrijger

Vero, ma se è necessario che esegua l'arresto corretto per ripulire le risorse condivise o riutilizzate (ad esempio volumi collegati, connessioni attive correttamente chiuse, ecc.), È necessario prima chiamare stop. Grande esempio, se hai un contenitore Jenkins, uccidere il contenitore è una cattiva idea. Volete che salvi eventuali modifiche non autorizzate, avvisiate gli utenti che hanno effettuato l'accesso e, cosa molto importante, interrompano correttamente tutte le build.
Kraig McConaghy,

concordato, questo è un caso d'uso molto valido
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
Quando rispondi, è meglio avere una spiegazione su cosa fa la soluzione piuttosto che solo un dump del codice, altrimenti la risposta potrebbe essere cancellata.
AlBlue,


2

Sto usando:

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

per eliminare i contenitori usciti e:

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

per sbarazzarsi di tutte le immagini senza tag.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.