web-dev-qa-db-fra.com

Comment supprimer les images Docker anciennes et inutilisées

Lorsque vous utilisez Docker pendant longtemps, le système contient de nombreuses images. Comment puis-je supprimer toutes les images Docker inutilisées en même temps, afin de libérer du stockage?

En outre, je souhaite également supprimer les images extraites il y a des mois, qui ont la bonne variable TAG.

Donc, je ne demande pas à supprimer uniquement les images non étiquetées. Je cherche un moyen de supprimer les images générales non utilisées, qui incluent à la fois les images non étiquetées et les images telles que celles extraites il y a des mois avec la bonne variable TAG.

563
Quanlong

Mettre à jour le deuxième (2017-07-08):

Reportez-vous (à nouveau) à VonC, en utilisant le system Prune encore plus récent. L’impatient peut ignorer l’invite avec l’option -f, --force:

docker system Prune -f

Les impatients et imprudents peuvent également supprimer "les images non utilisées non seulement les images qui pendent" avec l'option -a, --all:

docker system Prune -af

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

Mettre à jour:

Reportez-vous à La réponse de VonC qui utilise les commandes Prune récemment ajoutées. Voici la commodité de l'alias Shell correspondant:

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

Ancienne réponse:

Supprimer les conteneurs arrêtés (sortis):

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

Supprimer les images inutilisées (pendantes):

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

Si vous avez exercé extrême prudence en ce qui concerne perte de données irrévocable, vous pouvez supprimer les volumes inutilisés (en attente) (v1.9 et versions supérieures):

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

Les voici dans un alias de shell pratique:

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'

Références:

92
rubicks

Pour supprimer old tagged images datant de plus d’un mois:

$ docker images --no-trunc --format '{{.ID}} {{.CreatedSince}}' \
    | grep ' months' | awk '{ print $1 }' \
    | xargs --no-run-if-empty docker rmi

Notez que fail supprimera les images utilisées par un conteneur, référencées dans un référentiel, ayant des images enfants dépendantes ... ce qui est probablement ce que vous voulez. Sinon, ajoutez simplement -f flag.

Exemple de script /etc/cron.daily/docker-gc:

#!/bin/sh -e

# Delete all stopped containers (including data-only containers).
docker ps -a -q --no-trunc --filter "status=exited" | xargs --no-run-if-empty docker rm -v

# Delete all tagged images more than a month old
# (will fail to remove images still used).
docker images --no-trunc --format '{{.ID}} {{.CreatedSince}}' | grep ' months' | awk '{ print $1 }' | xargs --no-run-if-empty docker rmi || true

# Delete all 'untagged/dangling' (<none>) images
# Those are used for Docker caching mechanism.
docker images -q --no-trunc --filter dangling=true | xargs --no-run-if-empty docker rmi

# Delete all dangling volumes.
docker volume ls -qf dangling=true | xargs --no-run-if-empty docker volume rm
47
Wernight

En supposant que vous avez Docker 1.13 ou supérieur, vous pouvez simplement utiliser les commandes Élaguer. Pour votre question concernant spécifiquement la suppression des anciennes images, vous voulez la première.

# 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

Je recommanderais not de s'habituer à l'utilisation de la commande docker system Prune. Je pense que les utilisateurs vont supprimer accidentellement des choses qu'ils ne veulent pas. Personnellement, je vais utiliser principalement les commandes docker image Prune et docker container Prune.

17
Programster

Les autres réponses sont géniales, notamment:

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

Mais j'avais besoin de quelque chose au milieu des deux commandes, donc l'option filter était ce qu'il me fallait:

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

J'espère que cela pourra aider :)

Pour référence: https://docs.docker.com/config/pruning/#Prune-images

15
A L

Cela a fonctionné pour moi:

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

Jusqu'à présent (version 1.12 de Docker), nous utilisons la commande suivante pour supprimer tous les conteneurs en cours d'exécution. De plus, si nous voulons supprimer les volumes, nous pouvons le faire manuellement en utilisant sa balise respective -v dans la commande suivante.

Supprimer tous les conteneurs fermés

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

Supprimer tous les conteneurs arrêtés

docker rm $(docker ps -a -q)

Supprimer tous les conteneurs en cours d'exécution et arrêtés

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

Enlevez tous les conteneurs, sans aucun critère

docker container rm $(docker container ps -aq)

Mais, dans les versions 1.13 et supérieures, pour un nettoyage complet du système, nous pouvons directement utiliser la commande suivante:

docker system Prune

Tous les conteneurs, images, réseaux et volumes inutilisés seront supprimés. Nous pouvons également le faire en utilisant les commandes suivantes qui nettoient les composants individuels:

docker container Prune
docker image Prune
docker network Prune
docker volume Prune
8
mohan08p

J'ai récemment écrit un script pour résoudre ce problème sur l'un de mes serveurs:

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

Voici un script pour nettoyer les images Docker et récupérer l’espace.

#!/bin/bash -x
## Removing stopped container
docker ps -a | grep Exited | awk '{print $1}' | xargs docker rm

## If you do not want to remove all container you can have filter for days and weeks old like below
#docker ps -a | grep Exited | grep "days ago" | awk '{print $1}' | xargs docker rm
#docker ps -a | grep Exited | grep "weeks ago" | awk '{print $1}' | xargs docker rm

## Removing Dangling images
## There are the layers images which are being created during building a Docker image. This is a great way to recover the spaces used by old and unused layers.

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

## Removing images of perticular pattern For example
## Here I am removing images which has a SNAPSHOT with it.

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

## Removing weeks old images

docker images | grep "weeks ago" | awk '{print $3}' | xargs docker rmi

## Similarly you can remove days, months old images too.

Script original

https://github.com/vishalvsh1/docker-image-cleanup

Docker conserve généralement tous les fichiers temporaires liés à la création d’images et aux calques.

/ var/lib/docker

Ce chemin est local sur le système, généralement sur LA partition racine, "/".

Vous pouvez monter un espace disque plus important et déplacer le contenu de /var/lib/docker vers le nouvel emplacement de montage et créer un lien symbolique.

De cette façon, même si les images Docker occupent de la place, cela n’affectera pas votre système car il utilisera un autre emplacement de montage.

Message original: Gérer les images Docker sur un disque local

5

J'utilise cette commande:

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

Cela supprimera toutes les images dont le temps de création est supérieur à 10 semaines.

3
Yonatan Kiron

Si vous souhaitez supprimer des images extraitesXmois, vous pouvez essayer l’exemple ci-dessous qui supprime les images créées il ya trois mois:

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
3
spectre007

Comment supprimer une image marquée

  1. docker rmi le tag premier 

  2. docker rmi l'image. 

    # cela peut être fait dans un appel docker rmi par exemple: # docker rmi <repo: tag> <imageid>

(cela fonctionne novembre 2016, version 1.12.2 de Docker)

par exemple.

$ 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

par exemple. Scripted supprimer tout ce qui est plus vieux que 2 semaines.

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
2
gaoithe

@VonC a déjà donné une très bonne réponse, mais pour être complet, voici un petit script que j'utilise --- et qui annule également les processus de commande de Docker si vous en avez:

#!/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
2
Dirk Eddelbuettel

docker system Prune -a

(On vous demandera de confirmer la commande. Utilisez -f pour forcer l'exécution, si vous savez ce que vous faites.)

2
Vojtech Vitek

Pour supprimer les images marquées dont le conteneur n'est pas en cours d'exécution, vous devrez utiliser un petit 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
2
ospider
docker rm `docker ps -aq`

ou 

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

Si vous souhaitez nettoyer automatiquement/périodiquement les conteneurs fermés et supprimer les images et les volumes non utilisés par un conteneur en cours d'exécution, vous pouvez télécharger l'image meltwater/docker-cleanup.

Il suffit de courir:

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

Il fonctionne toutes les 30 minutes par défaut. Vous pouvez toutefois définir le délai en utilisant cet indicateur en secondes (option DELAY_TIME = 1800).

Plus de détails: https://github.com/meltwater/docker-cleanup/blob/master/README.md

1
Innocent Anigbo

Élaguer toutes les images et tous les volumes
docker system Prune -af --volumes

0
Zaytsev Dmitry

Il m'est parfois arrivé que Docker alloue et continue d'utiliser de l'espace disque, même lorsque cet espace n'est pas alloué à une image particulière ou à un conteneur existant. La dernière façon dont j'ai généré ce problème accidentellement consistait à utiliser la construction centos "docker-engine" au lieu de "docker" dans RHEL 7.1. Ce qui semble se produire, c'est parfois que les nettoyages de conteneurs ne sont pas terminés avec succès et que l'espace n'est jamais réutilisé. Lorsque le lecteur de 80 Go que j'ai alloué en tant que/était rempli de fichiers/var/lib/docker, je devais trouver un moyen créatif de résoudre le problème. 

Voici ce que je suis venu avec. D'abord pour résoudre l'erreur de disque plein:

  1. Stop docker: systemctl stop docker
  2. Alloué un nouveau lecteur monté comme par exemple/mnt/docker.
  3. Déplacez tous les fichiers de/var/lib/docker vers/mnt/docker. J'ai utilisé la commande suivante: rsync -aPHSx --remove-source-files/var/lib/docker// mnt/docker /
  4. Montez le nouveau lecteur sur/var/lib/docker.

À ce stade, je n'ai plus eu d'erreur de saturation totale du disque, mais je perdais encore énormément d'espace. Les prochaines étapes consistent à s’occuper de cela.

  1. Démarrer Docker: docker systemctl start

  2. Sauvegarder toutes les images: Docker save $ (images du docker | sed -e '/ ^/d' -e '/ ^ REPOSITORY/d' -e 's, [] [],:,' - e 's, []. ,')> /root/docker.img

  3. Désinstallez le menu fixe.

  4. Efface tout dans /var/lib/docker:rm -rf/var/lib/docker/[cdintv] *

  5. Réinstaller le menu fixe

  6. Activer le menu fixe: Systemctl activer le menu fixe

  7. Menu d'accueil: système de démarrage

  8. Restaurer les images: Docker load </root/docker.img

  9. Démarrez tous les conteneurs persistants dont vous avez besoin.

Cette utilisation de mon disque est passée de 67 Go pour le menu fixe à 6 Go pour le menu fixe.

Je ne le recommande pas pour un usage quotidien. Mais il est utile d'exécuter quand il semble que docker a perdu la trace de l'espace disque utilisé à cause d'erreurs logicielles ou de redémarrages inattendus.

0
briemers
docker rm $(docker ps -faq)
docker rmi $(docker ps -faq)
0
marven

Il existe sparrow plugin docker-remove-dangling-images vous pouvez utiliser pour nettoyer les conteneurs arrêtés et les images inutilisées:

$ sparrow plg run docker-remove-dangling-images

Cela fonctionne à la fois pour Linux et Windows.

0
Alexey Melezhik

Tout d’abord, lancez docker images pour voir la liste des images et copier l’ID de hachage IMAGE dans le presse-papiers.

Exécuter docker rmi -f <Image>

Rappelez-vous que l'option -f est une suppression forcée.

0
Le Khiem