Come rimuovere vecchi contenitori Docker

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

Mi sto chiedendo come rimuovere vecchi contenitori. La docker rm 3e552code34a ti consente di rimuovere una singola, ma ne ho già molte. docker rm --help non fornisce un’opzione di selezione (come tutti, o per nome dell’immagine).

Forse c’è una directory in cui sono memorizzati questi contenitori dove posso eliminarli facilmente manualmente?

C’è una nuova funzione in Docker 1.13.x chiamato Docker prune container : docker container prune

Questo farà ciò che vuoi e dovrebbe funzionare su tutte le piattaforms allo stesso modo.

Esiste anche una prugna per il sistema Docker : prune del docker system prune , che ripulirà contenitori, immagini, volumi e reti in un unico comando.

Risposta originale:

Si è parlato di un comando di pulizia Docker. Puoi trovare le informazioni su questo ticket: Implementa un comando ‘clean’ (# 928)

Finché questo comando non è disponibile, puoi stringere comandi Docker insieme ad altri comandi Unix per ottenere ciò che ti serve. Ecco un esempio su come pulire 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 è https://twitter.com/jpetazzo/status/347431091415703552 .

Un altro metodo, che ho ottenuto da Guillaume J. Charmes (credito dov’è 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 (4 ° trim. 2016), credito a VonC ( più avanti in questo thread ):

docker system prune eliminerà TUTTI i dati inutilizzati (vale a dire, nell’ordine: contenitori fermati, volumi senza contenitori e immagini senza contenitori).

Vedi PR 26108 e commit 86de7c0 , che stanno introducendo alcuni nuovi comandi per facilitare la visualizzazione di quanto spazio i dati del demone Docker stanno assumendo su disco e consentono di pulire 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 

Risposta aggiornata Utilizzare la docker system prune o il docker container prune la docker container prune ora. Vedi la risposta aggiornata di VonC .

Risposta precedente Comporre diversi suggerimenti 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 ​​del contenitore (senza intestazioni di colonna)
  • -f ti permette di filtrare l’elenco dei contenitori stampati (in questo caso stiamo filtrando per mostrare solo i contenitori usciti)

Il modo ufficiale è:

 docker rm `docker ps -aq` 

I manutentori di 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 usino la linea sopra senza dover aggiungere altro codice a Docker.

Con Docker 1.13 (4 ° trim. 2016), ora disponi di:

docker system prune -a cancellerà TUTTI i dati inutilizzati (cioè, nell’ordine: contenitori fermati, volumi senza contenitori e immagini senza contenitori).

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

Vedi PR 26108 e commit 86de7c0 , che stanno introducendo alcuni nuovi comandi per facilitare la visualizzazione di quanto spazio i dati del demone Docker stanno assumendo su disco e consentono di pulire 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 object.

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

 docker container prune 

Ora è ansible utilizzare il filtro con docker ps :

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

E per le immagini :

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

Tuttavia, uno di questi causerà la docker rm o la docker rmi a generare un errore quando non ci sono contenitori corrispondenti. Il vecchio trucco del docker rm $(docker ps -aq) stato anche peggio, in quanto ha cercato di rimuovere qualsiasi contenitore in esecuzione, in mancanza a ciascuno di essi.

Ecco uno script più pulito da aggiungere in ~/.bashrc o ~/.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, inclusi i nuovi collegamenti alla documentazione. Grazie ad Adrian (e alla risposta di Ryan) per aver menzionato il nuovo filtro ps .

AGGIORNATO 2017 (PIÙ NUOVO)

 docker container prune 

Questo – 2017 (OLD) modo

Per rimuovere TUTTI I CONTENITORI FERMATI

 docker rm $(docker ps -a -q) 

Per rimuovere TUTTI I CONTENITORI (FERMATI E NON FERMATI)

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

Rimuovi tutti i contenitori fermati:

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

Dal commento di pauk960 :

Dalla versione 1.3.0 puoi usare i filtri con docker ps , invece di grep Exited usa docker ps -a -f status=exited . E se si utilizza -q con esso è ansible ottenere solo ID contenitore invece di output completo, non è necessario utilizzare awk per questo.

Se non si desidera rimuovere tutti i contenitori, è ansible selezionare tutti i contenitori creati prima o dopo un contenitore specifico con docker ps --before o con docker ps --since . Questa funzionalità è almeno nella versione 0.6.5 di Docker.

Diciamo che hai sviluppato il tuo sistema, e ora funziona, ma ci sono ancora molti contenitori. Si desidera rimuovere i contenitori creati prima di quella versione funzionante. Determina l’ID del contenitore funzionante con docker ps .

Rimuovere i contenitori creati prima di un altro contenitore

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

Un altro esempio. Il tuo database è già in esecuzione su un contenitore Docker. Hai sviluppato la tua 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 in /var/lib/docker/containers in Ubuntu. Penso che i contenitori extra non facciano altro danno, ma occupino spazio su disco.

Aggiornamento: A partire da Docker versione 1.13 (rilasciata a gennaio 2017), è ansible emettere il seguente comando per ripulire i contenitori arrestati, i volumi inutilizzati, le immagini pendenti e le reti inutilizzate:

 docker system prune 

Se vuoi assicurarti di eliminare solo i contenitori con uno stato exited , utilizza questo:

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

Allo stesso modo, se stai ripulendo la finestra mobile, puoi eliminare le immagini senza tag e senza nome in questo modo:

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

Ecco lo script di docker-cleanup , che rimuove i contenitori e le 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 == "" {print $'$1'}' docker images | tail -n +2 | awk '$1 == "" {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

Rimozione di tutti i contenitori dalla shell di Windows:

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

Prima di tutto, interrompi l’esecuzione dei contenitori prima di tentare di rimuoverli

Rimuovere i contenitori in movimento

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

Potresti usare kill anziché stop . Nel mio caso, preferisco stop poiché tendo ad eseguirli nuovamente rispetto a crearne uno nuovo ogni volta, quindi cerco di chiuderli bene.

Nota: provare a fermare un container ti darà un errore:

Errore: imansible rimuovere un contenitore in esecuzione, si prega di fermarlo prima

Rimuovi tutti i contenitori

 docker rm $(docker ps -a -q) 

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

Pulizia Docker

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

Intendi eseguire come un lavoro crontab

caratteristica

  • Rimuoverà tutte le immagini :
  • Se l’immagine ha più repository: tag riferimenti ad esso, rimuoverà tutto il repository: tag tranne con l’esecuzione di un contenitore. In realtà è una natura di “docker rmi”.
  • Molti messaggi di errore saranno mostrati sullo schermo, e tu puoi decidere di 2>/dev/null o no
  • Impara qualcosa da docker-gc, e risolvi il problema (non è ansible rimuovere l’immagine che ha un repository multiplo: tag)

Uso:

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

Arresta e rimuove forzatamente tutti i contenitori presenti localmente.

Pertanto, personalmente raccomando di farlo come parte dello script di distribuzione per immagini e contenitori, mantenendo solo i n contenitori e le immagini più recenti. Contrassegno le mie immagini Docker con lo stesso schema di versioning che uso con git tag e tagge sempre l’ultima immagine di Docker con “latest”. Ciò significa che senza la pulizia nulla, le mie immagini Docker si presentano 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, naturalmente, non voglio mantenere tutte le mie immagini (o i miei contenitori) che tornano all’infinito su tutte le mie scatole di produzione. Voglio solo gli ultimi 3 o 4 per i rollback e per sbarazzarmi di tutto il resto. La tail di Unix è la tua migliore amica qui. Poiché le docker images e la docker ps ordinate per data, possiamo semplicemente usare tail per 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 conservare sempre solo un numero sufficiente di immagini per tornare comodamente indietro senza occupare troppo spazio o ingombrare roba con vecchie immagini.

Personalmente, tengo sempre un contenitore sulla mia scatola di produzione in qualsiasi momento, ma puoi fare lo stesso genere 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 con un solo repository alla volta, ma se ne hai di più, puoi essere un po ‘più sofisticato con la stessa idea. Dico che voglio solo mantenere le ultime tre immagini da some_repo / some_image. Posso semplicemente mixare in grep e awk ed essere sulla 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 lo ottieni, quindi smetterò di dare degli esempi.

Rimuovi tutti i contenitori fermati.

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

Questo rimuoverà tutti i contenitori arrestati ottenendo un elenco di tutti i contenitori con finestra mobile ps -a -q e passando i loro id a docker rm. Questo non dovrebbe rimuovere alcun contenitore in esecuzione e ti dirà che non è ansible rimuovere un’immagine in esecuzione.

Rimuovi tutte le immagini senza tag

Ora vuoi ripulire vecchie immagini per risparmiare spazio.

sudo docker rmi $ (sudo docker images -q –filter “dangling = true”)

Rimuovi 5 contenitori più vecchi:

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

Guarda quanti contenitori ci sono rimasti:

 docker ps -aq | wc -l 

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 a nessun 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 dati obsoleti

  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 contenitori orfani CLEAN_UP_VOLUMES = 1

Riferimento: docker-gc

Vecchio modo di fare:

elimina i vecchi contenitori non funzionanti

  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 di windows mobili non in esecuzione

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

pulire i volumi della finestra mobile orfana per la versione 1.10.x e successiva

  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. Rimuovi tutti i processi di finestra mobile:

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

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

È ansible utilizzare il seguente comando per rimuovere i contenitori usciti:

 docker rm $(sudo docker ps -a | grep Exit | cut -d ' ' -f 1) 

Ecco l’intero elenco per rimuovere anche le vecchie immagini sulla finestra mobile: Gist per rimuovere vecchi contenitori e immagini Docker .

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

  1. Elenca tutti i contenitori

    docker ps -aq

  2. Ferma tutti i contenitori in movimento

    docker stop $(docker ps -aq)

  3. Rimuovi tutti i contenitori

    docker rm $(docker ps -aq)

  4. Rimuovi tutte le immagini

    docker rmi $(docker images -q)

Nota: per prima cosa è necessario arrestare tutti i contenitori in esecuzione prima di rimuoverli. Inoltre, prima di rimuovere un’immagine, devi fermarti e rimuovere i suoi contenitori dipendenti.

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

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

È ansible rimuovere la directory /var/lib/docker/graph quando docker rmi non è riuscito.

È ansible rimuovere solo i contenitori interrotti. Smettila tutti all’inizio

docker stop $(docker ps -a -q)

Quindi puoi rimuovere

docker rm $(docker ps -a -q)

Prova questo comando per pulire i contenitori e le immagini che pendono.

 docker system prune -f 

Per rimuovere TUTTI i contenitori senza piangere:

 sudo docker ps -a | grep -v CONTAINER | awk '{print $1}' | xargs --no-run-if-empty sudo docker rm -f 

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

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

Rimuovi tutti i contenitori creati da una determinata immagine:

 docker rm $(docker ps -a | awk '/myimage:mytag/{print $1}')