Come rimuovere le immagini Docker vecchie e inutilizzate


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:

Question

Quando si esegue la finestra mobile molto tempo, ci sono molte immagini nel sistema. Come posso rimuovere tutte le immagini del docker inutilizzato in una volta sola per liberare spazio?

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 TAG corretto




docker system prune -a

(Ti verrà chiesto di confermare il comando Usa -f per forzare l'esecuzione, se sai cosa stai facendo.)




Supponendo di avere la finestra mobile 1.13 o successiva, è sufficiente utilizzare 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 .




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




Rimuovere vecchi contenitori settimane fa.

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

Rimuovi le vecchie immagini settimane fa. Stai attento. Ciò rimuoverà le immagini di base che sono state create settimane fa ma che potrebbero essere utilizzate dalle nuove immagini.

docker rmi $(docker images | grep 'weeks' | awk '{ print $3; }')




Recentemente ho scritto una sceneggiatura per risolvere questo problema su uno dei miei server:

#!/bin/bash

# Remove all the dangling images
DANGLING_IMAGES=$(docker images -qf "dangling=true")
if [[ -n $DANGLING_IMAGES ]]; then
    docker rmi "$DANGLING_IMAGES"
fi

# Get all the images currently in use
USED_IMAGES=($( \
    docker ps -a --format '{{.Image}}' | \
    sort -u | \
    uniq | \
    awk -F ':' '$2{print $1":"$2}!$2{print $1":latest"}' \
))

# Get all the images currently available
ALL_IMAGES=($( \
    docker images --format '{{.Repository}}:{{.Tag}}' | \
    sort -u \
))

# Remove the unused images
for i in "${ALL_IMAGES[@]}"; do
    UNUSED=true
    for j in "${USED_IMAGES[@]}"; do
        if [[ "$i" == "$j" ]]; then
            UNUSED=false
        fi
    done
    if [[ "$UNUSED" == true ]]; then
        docker rmi "$i"
    fi
done



Sto usando questo comando:

export BEFORE_DATETIME=$(date --date='10 weeks ago' +"%Y-%m-%dT%H:%M:%S.%NZ")
docker images -q | while read IMAGE_ID; do 
    export IMAGE_CTIME=$(docker inspect --format='{{.Created}}' --type=image ${IMAGE_ID})
    if [[ "${BEFORE_DATETIME}" > "${IMAGE_CTIME}" ]]; then 
        echo "Removing ${IMAGE_ID}, ${BEFORE_DATETIME} is earlier then ${IMAGE_CTIME}"
        docker rmi -f ${IMAGE_ID}; 
    fi; 
done

Questo rimuoverà tutte le immagini che il loro tempo di creazione è maggiore di 10 settimane fa.




Se vuoi rimuovere le immagini tirate X mesi fa, puoi provare qui di seguito l'esempio che rimuove le immagini create 3 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



docker rm `docker ps -aq`

o

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