Question Comment supprimer les anciennes images Docker inutilisées


Lorsque vous utilisez Docker depuis longtemps, il y a beaucoup d'images dans le système. Comment puis-je supprimer toutes les images Docker inutilisées à la fois pour libérer de l'espace de stockage?

En outre, je veux également supprimer les images tirées il y a des mois, qui ont la bonne TAG.

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


450
2017-09-22 17:23


origine


Réponses:


Mise à jour sept. 2016: Docker 1.13: PR 26108 et commenter 86de7c0 Introduisez quelques nouvelles commandes pour faciliter la visualisation de l'espace occupé par les données du démon Docker sur le disque et pour éliminer facilement les excès inutiles.

docker system prune supprimera TOUTES les données qui pendent (c'est-à-dire dans l'ordre: conteneurs arrêtés, volumes sans conteneurs et images sans conteneurs). Même les données inutilisées, avec -a option.

Vous avez aussi:

Pour inutilisé images, utilisation docker image prune -a (pour enlever les pendants et images non-émises).
Attention: 'inutilisé'signifie "images non référencées par un conteneur": soyez prudent avant d'utiliser -a.

Comme illustré dans ALde répondre, docker system prune --all enlèvera tout inutilisé des images qui ne se contentent pas de balancer ... ce qui peut être un peu trop.

Combiner docker xxx prune avec le --filter option peut être un excellent moyen de limiter la taille (docker SDK API 1,28 minimum, donc docker 17.04+)

Les filtres actuellement pris en charge sont les suivants:

  • until (<timestamp>) - supprimer uniquement les conteneurs, les images et les réseaux créés avant l'horodatage donné
  • label (label=<key>, label=<key>=<value>, label!=<key>, ou label!=<key>=<value>) - supprime uniquement les conteneurs, les images, les réseaux et les volumes avec (ou sans pour autant, au cas où label!=... est utilisé) les étiquettes spécifiées.

Voir "Taillez les images" à titre d'exemple.


Réponse d'origine (sept. 2016)

Je fais habituellement:

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

j'ai un alias pour supprimer ces [images en suspens]13: drmi

le dangling=true filtre trouve des images inutilisé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 premier pour processus sortis (conteneurs)

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

Comme haridsv fait remarquer dans les commentaires:

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


Jess Frazelle (jfrazelle) a la 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 les vieilles images, et pas seulement les images "non référencées-pendantes", vous pouvez envisager docker-gc:


Un simple conteneur Docker et un script de récupération de place d'image.

  • Les conteneurs qui sont sortis il y a plus d'une heure sont supprimés.
  • Les images qui n'appartiennent à aucun conteneur restant après cela sont supprimées.

951
2017-09-22 17:24



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

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

docker system prune -f

Les impatients et téméraire peut en outre supprimer "les images inutilisées pas seulement les pendantes" avec le -a, --all option:

docker system prune -af

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

Mettre à jour:

Faire référence à La réponse de VonC qui utilise le récemment ajouté prune commandes. Voici la commodité d'alias du shell correspondant:

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

Vieille réponse:

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

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

Supprimez 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 ensuite supprimer les volumes inutilisés (suspendus) (v1.9 et plus):

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

Ici, ils sont dans un alias 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'

Les références:


78
2018-01-05 16:46



Retirer vieux tagged images qui ont 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 ça va échouer pour supprimer les images utilisées par un conteneur, référencé dans un référentiel, possède des images enfants dépendantes ... ce qui est probablement ce que vous voulez. Sinon, ajoutez simplement -f drapeau.

Exemple de /etc/cron.daily/docker-gc scénario:

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

41
2018-03-01 10:59



En supposant que vous avez Docker 1.13 ou plus, vous pouvez simplement utiliser les commandes de pruneau. Pour votre question spécifique à la suppression des anciennes images, vous voulez le premier.

# 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 ne pas s'habituer à utiliser le docker system prune commander. Je pense que les utilisateurs enlèveront accidentellement des choses qu'ils ne veulent pas. Personnellement, je vais principalement utiliser le docker image prune et docker container prune commandes.


15
2018-02-15 08:16



Cela a fonctionné pour moi:

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

7
2018-05-08 10:30



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

6
2018-05-10 08:52



Jusqu'à présent (Docker version 1.12), 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 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 en cours d'exécution et arrêtés

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

Supprimer tous les conteneurs, sans aucun critère

docker container rm $(docker container ps -aq)

Mais, dans les versions 1.13 et supérieures, 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 non utilisé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

6
2018-03-06 05:48



Les autres réponses sont excellentes, en particulier:

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 pour que le filter l'option é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

J'espère que cela pourra aider :)

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


5
2018-05-18 07:04



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 au système, généralement à 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.

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


3
2018-06-29 17:06



docker rm `docker ps -aq`

ou

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

2
2017-09-27 13:31