Come rimuovere le immagini Docker vecchie e inutilizzate




10 Answers

Aggiorna la seconda (2017-07-08):

Fare riferimento (di nuovo) a VonC, usando la system prune ancora più recente. L'impaziente può saltare il prompt con l'opzione -f, --force :

docker system prune -f

L'impaziente e spericolato può inoltre rimuovere "le immagini non utilizzate non solo quelle penzolanti" con l'opzione -a, --all :

docker system prune -af

https://docs.docker.com/engine/reference/commandline/system_prune/

Aggiornare:

Fare riferimento alla risposta di VonC che utilizza i comandi di prune aggiunti di recente. Ecco la convenienza alias della shell corrispondente:

alias docker-clean=' \
  docker container prune -f ; \
  docker image prune -f ; \
  docker network prune -f ; \
  docker volume prune -f '

Vecchia risposta:

Elimina i contenitori interrotti (usciti):

$ docker ps --no-trunc -aqf "status=exited" | xargs docker rm

Elimina le immagini inutilizzate (penzolanti):

$ docker images --no-trunc -aqf "dangling=true" | xargs docker rmi

Se hai esercitato estrema cautela in merito alla perdita di dati irrevocabile , puoi eliminare i volumi inutilizzati (penzolanti) (dalla versione 1.9 e successive):

$ docker volume ls -qf "dangling=true" | xargs docker volume rm

Eccoli in un comodo alias di shell:

alias docker-clean=' \
  docker ps --no-trunc -aqf "status=exited" | xargs docker rm ; \
  docker images --no-trunc -aqf "dangling=true" | xargs docker rmi ; \
  docker volume ls -qf "dangling=true" | xargs docker volume rm'

Riferimenti:

docker

Quando si esegue Docker per un lungo periodo di tempo, ci sono molte immagini nel sistema. Come posso rimuovere tutte le immagini Docker inutilizzate in una volta sola per liberare la memoria?

Inoltre, voglio anche rimuovere le immagini tirate mesi fa, che hanno il TAG corretto.

Quindi, non sto chiedendo di rimuovere solo le immagini senza tag. Sto cercando un modo per rimuovere le immagini inutilizzate generiche, che include sia immagini senza tag che altre immagini come tirato mesi fa con il TAG corretto.




Supponendo che tu abbia Docker 1.13 o superiore puoi semplicemente usare i comandi di sfoltimento. Per la tua domanda specifica per rimuovere le vecchie immagini, vuoi la prima.

# Remove unused images
docker image prune

# Remove stopped containers.
docker container prune

# Remove unused volumes
docker volume prune

# Remove unused networks
docker network prune

# Command to run all prunes:
docker system prune

Raccomanderei di non docker system prune all'utilizzo del comando di docker system prune . Suppongo che gli utenti rimuoveranno per errore cose che non intendono. Personalmente, ho intenzione di utilizzare principalmente i comandi di docker container prune docker image prune e i comandi per la docker image prune docker container prune .




Le altre risposte sono grandi, in particolare:

docker system prune # doesn't clean out old images
docker system prune --all # cleans out too much

Ma avevo bisogno di qualcosa nel mezzo dei due comandi, quindi l'opzione filter era ciò di cui avevo bisogno:

docker image prune --all --filter "until=4320h" # delete images older than 6 months ago; 4320h = 24 hour/day * 30 days/month * 6 months

Spero che sia d'aiuto :)

Per riferimento: https://docs.docker.com/config/pruning/#prune-images




Fino ad ora (versione Docker 1.12) stiamo usando il seguente comando per cancellare tutti i container in esecuzione. Inoltre, se vogliamo eliminare i volumi, possiamo farlo manualmente utilizzando il rispettivo tag -v nel seguente comando.

Elimina tutti i contenitori usciti

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

Elimina tutti i contenitori interrotti

docker rm $(docker ps -a -q)

Elimina tutti i contenitori in esecuzione e interrotti

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

Rimuovere tutti i contenitori, senza alcun criterio

docker container rm $(docker container ps -aq)

Ma, nella versione 1.13 e successive, per il completo sistema e pulizia, possiamo direttamente utilizzare il seguente comando:

docker system prune

Tutti i contenitori, le immagini, le reti e i volumi inutilizzati verranno eliminati. Possiamo anche farlo usando i seguenti comandi per ripulire i singoli componenti:

docker container prune
docker image prune
docker network prune
docker volume prune



Se vuoi rimuovere le immagini tirate X mesi fa, puoi provare l'esempio seguente che rimuove le immagini create tre mesi fa:

three_months_old_images=`docker images | grep -vi "<none>" | tr -s ' ' | cut -d" " -f3,4,5,6 | grep "3 months ago" | cut -d" " -f1`
docker rmi $three_months_old_images



Per rimuovere le immagini con tag che non hanno container in esecuzione, dovrai utilizzare un piccolo script:

#!/bin/bash

# remove not running containers
docker rm $(docker ps -f "status=exited" -q)

declare -A used_images

# collect images which has running container
for image in $(docker ps | awk 'NR>1 {print $2;}'); do
    id=$(docker inspect --format="{{.Id}}" $image);
    used_images[$id]=$image;
done

# loop over images, delete those without a container
for id in $(docker images --no-trunc -q); do
    if [ -z ${used_images[$id]} ]; then
        echo "images is NOT in use: $id"
        docker rmi $id
    else
        echo "images is in use:     ${used_images[$id]}"
    fi
done



Come rimuovere un'immagine con tag

  1. finestra mobile rmi il tag prima

  2. docker rmi l'immagine.

    # che può essere fatto in una chiamata rmi docker ad esempio: # docker rmi <repo: tag> <imageid>

(funziona a novembre 2016, versione Docker 1.12.2)

per esempio

$ docker images 
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
usrxx/the-application   16112805            011fd5bf45a2        12 hours ago        5.753 GB
usryy/the-application   vx.xx.xx            5af809583b9c        3 days ago          5.743 GB
usrzz/the-application   vx.xx.xx            eef00ce9b81f        10 days ago         5.747 GB
usrAA/the-application   vx.xx.xx            422ba91c71bb        3 weeks ago         5.722 GB
usrBB/the-application   v1.00.18            a877aec95006        3 months ago        5.589 GB

$ docker rmi usrxx/the-application:16112805 && docker rmi 011fd5bf45a2
$ docker rmi usryy/the-application:vx.xx.xx && docker rmi 5af809583b9c
$ docker rmi usrzz/the-application:vx.xx.xx eef00ce9b81f
$ docker rmi usrAA/the-application:vx.xx.xx 422ba91c71bb
$ docker rmi usrBB/the-application:v1.00.18 a877aec95006

es. Scripted rimuove qualsiasi cosa più vecchia di 2 settimane.

IMAGESINFO=$(docker images --no-trunc --format '{{.ID}} {{.Repository}} {{.Tag}} {{.CreatedSince}}' |grep -E " (weeks|months|years)")
TAGS=$(echo "$IMAGESINFO" | awk '{ print $2 ":" $3 }' )
IDS=$(echo "$IMAGESINFO" | awk '{ print $1 }' )
echo remove old images TAGS=$TAGS IDS=$IDS
for t in $TAGS; do docker rmi $t; done
for i in $IDS; do docker rmi $i; done



@VonC ha già dato una risposta molto bella, ma per completezza ecco un piccolo script che sto usando --- e che bombarda anche tutti i processi Docker di commissione se dovessi averne alcuni:

#!/bin/bash

imgs=$(docker images | awk '/<none>/ { print $3 }')
if [ "${imgs}" != "" ]; then
   echo docker rmi ${imgs}
   docker rmi ${imgs}
else
   echo "No images to remove"
fi

procs=$(docker ps -a -q --no-trunc)
if [ "${procs}" != "" ]; then
   echo docker rm ${procs}
   docker rm ${procs}
else
   echo "No processes to purge"
fi



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

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

Viene eseguito ogni 30 minuti per impostazione predefinita. Puoi comunque impostare il tempo di ritardo usando questo flag in secondi (DELAY_TIME = 1800 option).

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









Related


Tags

docker