Come posso eliminare le immagini di Docker?


265

Ho le seguenti immagini:

alex@alexvps:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
<none>              <none>              70c0e19168cf        5 days ago          1.069 GB
<none>              <none>              c2ce80b62174        8 days ago          399.2 MB
<none>              <none>              60afe4036d97        8 days ago          325.1 MB

e quando provo a rimuoverne uno ottengo:

alex@alexvps:~$ sudo docker rmi 60afe4036d97
Error: Conflict, 60afe4036d97 wasn't deleted
2014/01/28 00:54:00 Error: failed to remove one or more images

Come posso rimuoverli? Perché c'è un tale conflitto?

Risposte:


478

Per eliminare tutte le immagini, utilizzare il comando indicato

docker rmi $(docker images -q)

Per eliminare tutti i contenitori, utilizzare il comando indicato

docker rm $(docker ps -a -q)

Avvertenza: questo distruggerà tutte le immagini e i contenitori. Non sarà possibile ripristinarli!

Questa soluzione è fornita da Techoverflow.net .


17
Semplice e diretto. Anche sotto il comando per forzare la rimozione di immagini. 'docker rmi -f $ (docker images -q)'
dimuthu

37
L'equivalente di Windows PowerShell èdocker images -q | %{docker rmi -f $_}
BeatingToADifferentRobot,

1
Per prima cosa ho usato il cmd su @muheed How to Answer ( stackoverflow.com/a/30475249/2747020 ) per sbloccare la rimozione di alcune immagini:sudo docker ps -a -q | xargs -n 1 -I {} sudo docker rm {}
Razec Luar

1
Windows Powershell per container dockerdocker ps -a -q | %{docker rm -f $_}
Dexter

1
Come alle note di @ alexyz78 di seguito, ora puoi usare docker system prune. Quindi, per cancellare tutto: docker kill $(docker ps -q)per fermare i contenitori seguito da un docker system prune -arimuoverà tutto - vedi stackoverflow.com/a/44309011/247708
Bharat

101

Possibile motivo: il motivo può essere che questa immagine è attualmente utilizzata da un contenitore in esecuzione. In tal caso, è possibile elencare i contenitori in esecuzione, arrestare il contenitore pertinente e quindi rimuovere l'immagine:

docker ps
docker stop <containerid>
docker rm <containerid>
docker rmi <imageid>

Se non riesci a trovare un contenitore dalla finestra mobile ps, puoi utilizzarlo per elencare tutti i contenitori già usciti e rimuoverli.

docker ps -a | grep 60afe4036d97
docker rm <containerid>

Nota: fare attenzione a eliminare tutti i contenitori usciti contemporaneamente nel caso in cui si utilizzino Volume-Onlycontenitori. Questi rimangono nello Exitstato, ma contengono dati utili .


In realtà, riceveresti un messaggio che lo specifica. Forse un'altra immagine è basata su questa? Prova a rimuovere tutte le immagini che hai creato prima da questa immagine.
qkrijger,

12
Sono stato in grado di rimuovere l'immagine con sudo docker ps -a | grep Exit | awk '{print $1}' | sudo xargs docker rm(grazie a github.com/dotcloud/docker/issues/3258 ) e poi consudo docker rmi 70c0e19168cf
alexyz78,

2
Fare attenzione a eliminare le immagini nello Exitstato. Se si utilizzano contenitori solo del volume di dati, questi non rimangono in esecuzione.
aceofspades,

1
awk can grep:awk '/Exit/ {print $1}'
Dwight Spencer il

I tuoi comandi lanciano questo Error response from daemon: No such container: .... È difficile dire cosa debba essere sostituito e con cosa dovrei sostituirlo. Non usare...
Felo Vilches

60

Il motivo dell'errore è che anche se l'immagine non aveva alcun tag, esiste ancora un contenitore creato su quell'immagine che potrebbe essere nello exitedstato. Quindi è necessario assicurarsi di aver arrestato ed eliminato tutti i contenitori creati su quelle immagini. Il seguente comando ti aiuta a rimuovere tutti i contenitori che non sono in esecuzione:

docker rm `docker ps -aq --no-trunc --filter "status=exited"`

Ora questo rimuove tutte le <none>immagini non intermedie pendenti :

docker rmi `docker images --filter 'dangling=true' -q --no-trunc`

Nota: per interrompere tutti i contenitori in esecuzione:

docker stop `docker ps -q`

1
Grazie per questo, ho scoperto che questa è l'implementazione più pulita.
Joseph Sawyer,

7
Fare attenzione se si hanno contenitori del volume di dati poiché hanno "status = uscito". Ciò significa che perderai tutti i tuoi dati.
Johan

19

L'immagine potrebbe essere attualmente utilizzata da un contenitore in esecuzione, quindi è necessario prima arrestare e rimuovere i contenitori.

docker stop <container-name>
docker rm <container-id>

Quindi potresti provare a eliminare l'immagine:

docker rmi <image-id>

Devi essere sicuro che questa immagine non dipende da altre immagini (altrimenti devi prima cancellarle).

Ho avuto uno strano caso in cui non avevo più contenitori ancora in vita ( docker ps -anon ha restituito nulla) ma non sono riuscito a eliminare l'immagine e la sua dipendenza dall'immagine.

Per risolvere questi casi speciali potresti forzare la rimozione dell'immagine con questo:

docker rmi -f <image-id>

19

In Bash:

for i in `sudo docker images|grep \<none\>|awk '{print $3}'`;do sudo docker rmi $i;done

Ciò rimuoverà tutte le immagini con il nome "<none>". Ho trovato quelle immagini ridondanti.


3
Questo non risponde alla domanda, ma è comunque molto utile. Grazie.
binwiederhier,

5
rendi semplice questo comando docker images|grep \<none\>|awk '{print $3}' | xargs docker rmi, potrebbe essere necessario il sudopermesso
Larry Cai,

15

Ho trovato la risposta in questo comando:

docker images --no-trunc | grep none | awk '{print $3}' | xargs docker rmi

Ho avuto il tuo problema quando ho eliminato alcune immagini che erano in uso e non me ne sono reso conto (usando docker ps -a).


9

Dalla Docker ver. 1.13.0 (gennaio 2017) c'è il system prunecomando:

$ docker system prune --help

Usage:  docker system prune [OPTIONS]

Remove unused data

Options:
-a, --all     Remove all unused images not just dangling ones
-f, --force   Do not prompt for confirmation
    --help    Print usage

7

Oltre alla risposta di Sunny:

Per eliminare tutte le immagini su un computer Windows (con Docker per Windows) in una finestra di PowerShell, eseguire:

docker images -q | %{docker rmi -f $_}

Per eliminare tutti i contenitori su un computer Windows (con Docker per Windows) in una finestra di PowerShell, eseguire:

docker ps -a -q | %{docker rm -f $_}

6

Innanzitutto, rimuovere tutti i contenitori utilizzando il seguente comando

sudo docker ps -a -q | xargs -n 1 -I {} sudo docker rm {}

Quindi, rimuovere l'immagine con il suo ID usando il seguente comando

sudo docker rmi <image-id>

Vale la pena notare nel caso in cui questo non sia ovvio per alcuni che questo rimuoverà tutti i contenitori Docker in esecuzione.
Michael Mior,


4

Rimuovere tutti i contenitori

docker ps -q -a | xargs docker rm

Forza la rimozione di tutte le immagini Docker

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

4

Semplicemente puoi aggiungere --forcealla fine del comando. Piace:

sudo docker rmi <docker_image_id> --force

Per renderlo più intelligente puoi aggiungere come:

sudo docker stop $(docker ps | grep <your_container_name> | awk '{print $1}')

sudo docker rm $(docker ps | grep <your_container_name> | awk '{print $1}')

sudo docker rmi $(docker images | grep <your_image_name> | awk '{print $3}') --force

Qui in docker ps$ 1 è la prima colonna, ovvero l'ID del contenitore Docker.

E docker images$ 3 è la terza colonna, ovvero l'ID dell'immagine Docker.


3

La versione più compatta di un comando per rimuovere tutte le immagini senza tag è:

docker rmi $(docker images | grep "^<none>" | awk '{print $"3"}')

3

Per eliminare un'immagine Docker è necessario eseguire il comando seguente:

$ docker rmi <docker_image_id>

Quindi, per eliminare tutte le immagini Docker è possibile eseguire il comando seguente:

$ docker rmi $(docker images -q)

Ora, se si desidera eliminare tutte le immagini Docker (comprese le immagini in uso), è possibile aggiungere il flag -f, ad esempio:

$ docker rmi -f $(docker images -q)

3

Uso

docker image prune -all

o

docker image prune -a

Rimuovi tutte le immagini pendenti. Se -aspecificato, rimuoverà anche tutte le immagini a cui non fa riferimento alcun contenitore.

Nota: viene richiesta la conferma prima che la prugna rimuova qualcosa, ma non viene visualizzato un elenco di ciò che sarà potenzialmente rimosso. Inoltre, docker image lsnon supporta il filtro negativo, quindi è difficile prevedere quali immagini verranno effettivamente rimosse.

Come indicato nella documentazione di Docker per la prugna .


1

Se si desidera ripulire automaticamente / periodicamente i contenitori usciti e rimuovere immagini e volumi non utilizzati da un contenitore in esecuzione, è possibile scaricare l'immagine Docker meltwater/docker-cleanup.

In questo modo non è necessario pulirlo a mano.

Corri:

docker run -d -v /var/run/docker.sock:/var/run/docker.sock:rw  -v /var/lib/docker:/var/lib/docker:rw --restart=unless-stopped meltwater/docker-cleanup:latest

Funzionerà ogni 30 minuti (o per quanto tempo lo imposti usando l'opzione DELAY_TIME = 1800) e ripulirà i contenitori e le immagini usciti.

Maggiori dettagli: https://github.com/meltwater/docker-cleanup/blob/master/README.md


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.