Comment supprimer des images de Docker anciennes et inutilisées

lors de L'exécution de Docker pendant une longue période, Il y a beaucoup d'images dans le système. Comment puis-je supprimer toutes les images inutilisées Docker à la fois de sécurité pour libérer le stockage?

en outre, je veux également supprimer les images tirées Il ya des mois, qui ont la bonne TAG .

donc, je ne demande pas de supprimer uniquement les images non étiquetées. Je suis à la recherche d'un moyen de supprimer les images inutilisées générales, qui comprend à la fois non étiqueté et d'autres images telles que tiré il y a des mois avec le correct TAG .

485
demandé sur Peter Mortensen 2015-09-22 20:23:37

20 réponses

Mise À Jour Sept. 2016: Docker 1.13: PR 26108 et commit 86de7c0 introduisez quelques nouvelles commandes pour faciliter la visualisation de l'espace que le daemon docker prend sur le disque et permettant de nettoyer facilement l'excès" inutile".

docker system prune supprimera toutes les données pendantes (c.-à-d. dans l'ordre: conteneurs arrêtés, volumes sans conteneurs et images sans contenant). Même les données non utilisées, avec l'option -a .

vous avez aussi:

Pour inutilisé images, utilisez docker image prune -a (pour supprimer les images pendantes et ).

Avertissement: " non utilisé "signifie" images non référencées par un conteneur": faire attention avant d'utiliser -a .

Comme illustré dans la Un L 's réponse , docker system prune --all va supprimer tous les inutilisé les images ne sont pas seulement bancales... ce qui peut être un peu trop beaucoup.

combiner docker xxx prune avec --filter option peut être un excellent moyen de limiter la taille ( Docker SDK API 1.28 minimum, so docker 17.04+ )

les filtres actuellement supportés sont:

  • until (<timestamp>) - ne supprimez que les conteneurs, les images et les réseaux créés avant la date indiquée
  • label ( label=<key> , label=<key>=<value> , label!=<key> , ou label!=<key>=<value> ) - ne retirer que les conteneurs, les images, les réseaux et les volumes avec (ou sans , dans le cas où label!=... est utilisé) les étiquettes spécifiées.

Voir " Taille des images " pour un exemple.


réponse Originale à cette question (Sep. 2016)

j'ai l'habitude de faire:

docker rmi $(docker images --filter "dangling=true" -q --no-trunc)

j'ai un alias pour supprimer ces images pendantes] 13 : drmi

le dangling=true filtre trouve des images non utilisées

de cette façon, toute image intermédiaire qui n'est plus référencée par une image étiquetée est supprimée.

je fais la même chose première pour sorti de processus (conteneurs)

alias drmae='docker rm $(docker ps -qa --no-trunc --filter "status=exited")'

Comme haridsv souligne dans les commentaires :

techniquement, vous devez d'abord nettoyer les conteneurs avant de nettoyer les images, car cela rattrapera plus d'images pendantes et moins d'erreurs .


Jess Frazelle (jfrazelle) a le fonction bashrc :

dcleanup(){
    docker rm -v $(docker ps --filter status=exited -q 2>/dev/null) 2>/dev/null
    docker rmi $(docker images --filter dangling=true -q 2>/dev/null) 2>/dev/null
}

pour supprimer de vieilles images, et pas seulement des images "non référencées-pendantes", vous pouvez considérer docker-gc :


Un simple conteneur Docker et de l'image de collecte des ordures script.

  • conteneurs qui sont sortis plus d'une heure il y a sont supprimés.
  • Images qui n'appartiennent à aucun conteneur restant après que sont enlevés.
1008
répondu VonC 2018-05-18 08:13:28

mise à Jour de la deuxième (2017-07-08):

se réfère (à nouveau) à VonC, en utilisant le encore plus récent system prune . L'impatient peut sauter l'invite avec l'option -f, --force :

docker system prune -f

Les impatients et téméraire peut aussi supprimer les "images inutilisées pas seulement la bancale" avec la -a, --all option:

docker system prune -af

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

mise à jour:

Consultez VonC la réponse de qui utilise le récemment ajouté prune des commandes. Voici le shell correspondant alias convenience:

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

) images:

$ 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 , alors vous pouvez supprimer les volumes non utilisés (pendants) (v1.9 et plus):

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

les voici dans un shell pratique alias:

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'

, les Références:

86
répondu rubicks 2017-07-08 22:14:49

supprimer vieux tagged des images qui sont de plus d'un mois:

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

notez qu'il va fail pour supprimer les images qui sont utilisées par un conteneur, référencé dans un dépôt, a des images enfant dépendantes... ce qui est probablement ce que vous voulez. Sinon, il suffit d'ajouter le drapeau -f .

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

#!/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  }' | 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
43
répondu Wernight 2016-03-01 11:05:14

en supposant que vous avez Docker 1.13 ou plus, vous pouvez simplement utiliser les commandes prune. Pour votre question spécifiquement pour enlever de vieilles 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 recommande pas s'habituer à utiliser la commande docker system prune . Je pense que les utilisateurs accidentellement supprimer des choses qu'ils ne veux pas. Personnellement, je vais principalement utiliser les commandes docker image prune et docker container prune .

16
répondu Programster 2018-07-24 21:38:15

cela a fonctionné pour moi:

docker rmi $(docker images | grep "^<none>" | awk "{print }")
9
répondu Mahmoud Zalt 2016-05-08 10:30:06

les autres réponses sont grandes, spécifiquement:

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 dont j'avais besoin:

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

Espère que cela aide :)

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

8
répondu A L 2018-05-18 07:04:16

j'ai récemment écrit un script pour résoudre ce sur 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 ':' '{print ":"}!{print ":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
répondu Ell Neal 2016-05-10 08:52:07

Jusqu'à présent (Docker version 1.12) nous utilisons la commande suivante pour supprimer tous les conteneurs en cours d'exécution. En outre, si nous voulons supprimer les volumes, nous pouvons le faire manuellement en utilisant son tag-v respectif dans la commande suivante.

supprimer tous les conteneurs sortis

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 Arrêtés

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

enlever tous les contenants, sans aucun critère

docker container rm $(docker container ps -aq)

mais, dans la version 1.13 et ci-dessus, pour le système complet et le nettoyage, 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 aussi le faire en utilisant les commandes suivantes que nettoyer les composants individuels:

docker container prune
docker image prune
docker network prune
docker volume prune
7
répondu mohan08p 2018-07-24 21:39:21

voici un script pour nettoyer les images des dockers et récupérer l'espace.

#!/bin/bash -x
## Removing stopped container
docker ps -a | grep Exited | awk '{print }' | 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 }' | xargs docker rm
#docker ps -a | grep Exited | grep "weeks ago" | awk '{print }' | 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 }')

## Removing weeks old images

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

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

scénario Original

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

habituellement Docker conserve tous les fichiers temporaires liés à la construction de l'image et les calques à

/var/lib/menu fixe

ce chemin est local au système, habituellement à la partition racine, "/" .

vous pouvez monter un plus grand espace disque et déplacer le contenu de /var/lib/docker à la nouvelle position de montage et faire un lien symbolique.

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

Original post: Gérer Docker images sur le disque local

4
répondu vishal sahasrabuddhe 2018-07-24 21:36:27

si vous voulez supprimer des images tirées X il y a des mois, vous pouvez essayer l'exemple ci-dessous qui suppriment des images créées il y a 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
répondu spectre007 2018-07-24 21:14:24
docker rm `docker ps -aq`

ou

docker rm $(docker ps -q -f status=exited)
2
répondu mainframer 2015-09-27 13:31:22

Pour supprimer les images qui n'ont pas de conteneur 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 ;}'); 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
répondu ospider 2016-08-23 03:00:58

Comment supprimer une image marquée

  1. docker rmi la première balise

  2. docker rmi de l'image.

    # qui peut être fait en un seul appel RMI docker par exemple: # docker rmi < imageid>

(this works Nov 2016, Docker version 1.12.2)

p.ex.

$ 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

p.ex. Scripted supprimer tout ce qui date de plus de 2 semaines.

IMAGESINFO=$(docker images --no-trunc --format '{{.ID}} {{.Repository}} {{.Tag}} {{.CreatedSince}}' |grep -E " (weeks|months|years)")
TAGS=$(echo "$IMAGESINFO" | awk '{ print  ":"  }' )
IDS=$(echo "$IMAGESINFO" | awk '{ print  }' )
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
répondu gaoithe 2017-03-31 11:11:43

docker system prune -a

(vous devrez confirmer la commande. Utilisez -f pour forcer la course, si vous savez ce que vous faites.)

2
répondu Vojtech Vitek 2017-06-02 20:31:16

@VonC a déjà donné une très bonne réponse, mais pour être complet, voici un petit script que j'ai utilisé - - - et qui nukes aussi tous les processus de drague si vous en avez:

#!/bin/bash

imgs=$(docker images | awk '/<none>/ { print  }')
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
répondu Dirk Eddelbuettel 2018-07-24 21:13:47

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.

2
répondu Yonatan Kiron 2018-07-24 21:40:26

retirer les vieux containers il y a des semaines.

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

supprimer les vieilles images il y a des semaines. Être prudent. Cela supprimera les images de base qui ont été créées il y a des semaines mais que vos nouvelles images pourraient utiliser.

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

1
répondu Antony.H 2017-01-20 03:09:00

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

il suffit d'exécuter:

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 court toutes les 30 minutes par défaut. Vous pouvez toutefois régler le délai en utilisant ce drapeau en secondes (option DELAY_TIME=1800).

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

1
répondu Innocent Anigbo 2018-07-24 21:41:16

de temps en temps, J'ai rencontré des problèmes où Docker attribuera et continuera d'utiliser l'espace disque, même si l'espace n'est pas attribué à une image particulière ou un conteneur existant. La dernière façon dont j'ai généré ce problème par accident était d'utiliser "docker-engine" centos build au lieu de "docker" dans RHEL 7.1. Ce qui semble se produire est parfois le nettoyage des conteneurs ne sont pas réalisés avec succès et puis l'espace n'est jamais réutilisé. Quand le disque de 80 Go que j'ai alloué comme / a été rempli avec /var/lib/docker fichiers que j'ai dû trouver une façon créative pour résoudre le problème.

voilà ce que j'ai trouvé. Premier à résoudre l'erreur complète du disque:

  1. Stop docker: systemctl stop docker
  2. a attribué un nouveau disque monté comme say /mnt/docker .
  3. déplace tous les fichiers dans /var/lib/docker vers /mnt/docker . J'ai utilisé la commande: rsync -aPHSx --remove-source-les fichiers /var/lib/docker/ /mnt/docker/
  4. montez le nouveau lecteur à / var/lib / docker.

à ce point je n'avais plus de disque pleine erreur, mais je gaspillais encore une énorme quantité d'espace. Les prochaines étapes consistent à s'en occuper.

  1. Start menu fixe: systemctl start menu fixe

  2. Enregistrer toutes les images: docker économisez $(docker images |sed-e '/^/d' -e '/^RÉFÉRENTIEL de/d' -e 's,[ ][ ] ,:, ' - e 's, []. ,,,') > /root/docker.img

  3. désinstaller docker.

  4. Tout effacer dans / var/lib/docker: rm-rf / var/lib/docker / [cdintv]*

  5. Réinstaller le panneau

  6. Activer le menu fixe: systemctl enable docker

  7. Start menu fixe: systemctl démarrer panneau

  8. restaurer des images: charge de docker < / root / docker.img

  9. démarrez tout conteneur persistant que vous devez exécuter.

cela a fait tomber l'utilisation de mon disque de 67 GO pour docker à 6 Go pour docker.

Je ne le recommande pas pour un usage quotidien. Mais il est utile de courir quand il ressemble à docker a perdu la trace de l'espace disque utilisé faire pour erreurs de logiciel, ou redémarrage inattendu.

0
répondu briemers 2016-08-30 13:47:20

Il n'y a sparrow plugin docker-supprimer-pend-images vous pouvez utiliser pour nettoyer cessé de conteneurs et inutilisés (bancales) images:

$ sparrow plg run docker-remove-dangling-images

il fonctionne à la fois pour Linux et Windows OS.

0
répondu Alexey Melezhik 2018-09-13 14:25:00