it-swarm.com.de

So entfernen Sie alte und nicht verwendete Docker-Images

Wenn Sie Docker längere Zeit ausführen, befinden sich viele Bilder im System. Wie kann ich alle unbenutzten Docker-Images gleichzeitig entfernen, um den Speicher freizugeben?

Außerdem möchte ich vor Monaten gezogene Bilder entfernen, die die korrekte TAG haben.

Daher möchte ich nicht nur unmarkierte Bilder entfernen. Ich suche nach einer Möglichkeit, allgemeine, nicht verwendete Bilder zu entfernen. Dazu gehören sowohl unmarkierte als auch andere Bilder, die vor Monaten mit korrekter TAG abgerufen wurden.

563
Quanlong

Update Sept. 2016: Docker 1.13: PR 26108 und commit 86de7c0 führen ein paar neue Befehle ein, um die Visualisierung des Speicherplatzes zu vereinfachen Die Daten des Docker-Daemons werden auf der Festplatte abgelegt und ermöglichen das einfache Aufräumen von "nicht benötigten" Überschüssen.

docker system Prune löscht ALLE baumelnden Daten (dh In der Reihenfolge: Container gestoppt, Volumen ohne Behälter und Bilder ohne Behälter). Selbst unbenutzte Daten mit der Option -a.

Sie haben auch:

Verwenden Sie für unbenutzt Bilder docker image Prune -a (Zum Entfernen von baumelnden und nicht unbenutzten Bildern).
Warnung: ' unbenutzt' bedeutet "Bilder, auf die kein Container verweist": Seien Sie vorsichtig, bevor Sie -a Verwenden.

Wie in der Antwort von AL dargestellt, entfernt docker system Prune --all Alle nicht verwendeten = Bilder, die nicht nur baumeln ... was ein bisschen zu viel sein kann.

Das Kombinieren von docker xxx Prune Mit der Option --filter kann eine großartige Möglichkeit sein, das Minimum der Bereinigungs-Docker-SDK-API 1.28 zu begrenzen , also Docker 17.04 + )

Die derzeit unterstützten Filter sind:

  • until (<timestamp>) - Nur Container, Bilder und Netzwerke entfernen, die vor dem angegebenen Zeitstempel erstellt wurden
  • label (label=<key>, label=<key>=<value>, label!=<key> oder label!=<key>=<value>) - Entfernen Sie nur Container, Bilder, Netzwerke und Volumes mit (oder) ohne, falls label!=... verwendet wird) die angegebenen Bezeichnungen.

Ein Beispiel finden Sie unter " Bilder beschneiden ".


Ursprüngliche Antwort (Sep. 2016)

Normalerweise mache ich:

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

Ich habe einen Alias ​​für das Entfernen dieser [baumelnden Bilder]13 : drmi

Der Filter dangling=true Findet nicht verwendete Bilder

Auf diese Weise wird jedes Zwischenbild entfernt, auf das von einem beschrifteten Bild nicht mehr verwiesen wird.

Ich mache das gleiche zuerst für abgeschlossene Prozesse (Container)

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

Wie , weist haridsv in den Kommentaren darauf hin :

Technisch gesehen sollten Sie zuerst die Container bereinigen, bevor Sie die Bilder bereinigen, da dies zu mehr baumelnden Bildern und weniger Fehlern führt .


Jess Frazelle (jfrazelle) hat die bashrc Funktion :

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
}

Um alte Bilder und nicht nur "nicht referenzierte" Bilder zu entfernen, können Sie docker-gc :


Ein einfaches Docker-Container- und Image Garbage Collection-Skript.

  • Container, die vor mehr als einer Stunde beendet wurden, werden entfernt.
  • Bilder, die danach zu keinem verbleibenden Container gehören, werden entfernt.
1283
VonC

Aktualisieren Sie die zweite (2017-07-08):

Verweisen Sie (erneut) auf VonC, indem Sie den noch aktuelleren system Prune verwenden. Der Ungeduldige kann die Eingabeaufforderung mit der Option -f, --force überspringen:

docker system Prune -f

Die Ungeduldigen und rücksichtslos können zusätzlich "ungenutzte Bilder, nicht nur die baumelnden" mit der -a, --all-Option entfernen:

docker system Prune -af

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

Aktualisieren:

Siehe VonCs Antwort die die kürzlich hinzugefügten Prune-Befehle verwendet. Hier ist der entsprechende Shell-Alias:

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

Alte Antwort:

Löschen gestoppter (verlassener) Container:

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

Löschen Sie nicht verwendete (baumelnde) Bilder:

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

Wenn Sie extreme Vorsicht in Bezug auf unwiderruflicher Datenverlust ausgeübt haben, können Sie nicht verwendete (unvollständige) Volumes (v1.9 und höher) löschen:

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

Hier sind sie in einem praktischen Shell-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'

Verweise:

92
rubicks

alte markierte Bilder entfernen, die älter als einen Monat sind:

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

Beachten Sie, dass es fail ist, Images zu entfernen, die von einem Container verwendet werden, auf den in einem Repository verwiesen wird, abhängige untergeordnete Images hat ... was Sie wahrscheinlich wollen. Ansonsten fügen Sie einfach -f-Flag hinzu.

Beispiel für ein /etc/cron.daily/docker-gc-Skript:

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

Vorausgesetzt, Sie haben Docker 1.13 oder höher, können Sie einfach die Prune-Befehle verwenden. Für Ihre Frage, speziell zum Entfernen alter Bilder, möchten Sie das erste Bild.

# 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

Ich würde not empfehlen, sich an den Befehl docker system Prune zu gewöhnen. Ich denke, Benutzer werden versehentlich Dinge entfernen, die sie nicht meinen. Ich persönlich werde hauptsächlich die Befehle docker image Prune und docker container Prune verwenden.

17
Programster

Die anderen Antworten sind großartig, insbesondere:

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

Aber ich brauchte etwas in der Mitte der beiden Befehle, also war die Option filter genau das, was ich brauchte:

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

Hoffentlich hilft das :)

Für Referenz: https://docs.docker.com/config/pruning/#Prune-images

15
A L

Das hat für mich funktioniert:

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

Bis jetzt (Docker Version 1.12) verwenden wir den folgenden Befehl, um alle laufenden Container zu löschen. Wenn Sie die Volumes löschen möchten, können Sie dies auch manuell mit dem entsprechenden Tag -v im folgenden Befehl tun.

Alle verlassenen Container löschen

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

Alle angehaltenen Container löschen

docker rm $(docker ps -a -q)

Alle laufenden und gestoppten Container löschen

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

Entferne alle Behälter ohne Kriterien

docker container rm $(docker container ps -aq)

In Version 1.13 und höher können Sie jedoch für ein vollständiges System und eine Bereinigung den folgenden Befehl direkt verwenden:

docker system Prune

Alle nicht verwendeten Container, Bilder, Netzwerke und Volumes werden gelöscht. Wir können dies auch mit den folgenden Befehlen tun, die die einzelnen Komponenten bereinigen:

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

Hier ist ein Skript, um Docker-Images zu bereinigen und den Speicherplatz freizugeben.

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

Originalschrift

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

Normalerweise behält Docker alle temporären Dateien, die sich auf das Erstellen von Bildern und Ebenen beziehen, bei

/var/lib/docker

Dieser Pfad ist für das System lokal, normalerweise auf der Root-Partition "/" .

Sie können einen größeren Speicherplatz bereitstellen und den Inhalt von /var/lib/docker An die neue Bereitstellungsposition verschieben und einen symbolischen Link erstellen.

Selbst wenn Docker-Images Speicherplatz belegen, hat dies keine Auswirkungen auf Ihr System, da es einen anderen Einhängeort verwendet.

Originaler Beitrag: Docker-Images auf lokaler Festplatte verwalten

Ich habe kürzlich ein Skript geschrieben, um dieses Problem auf einem meiner Server zu lösen:

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

Ich verwende diesen Befehl:

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

Dadurch werden alle Bilder entfernt, deren Erstellungszeit vor 10 Wochen überschritten wurde.

3
Yonatan Kiron

Wenn Sie Bilder entfernen möchten, die X vor Monaten gezogen wurden, können Sie das folgende Beispiel versuchen, das Bilder entfernt, die vor drei Monaten erstellt wurden:

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

Entfernen Sie alte Container vor Wochen.

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

Entfernen Sie alte Bilder vor Wochen. Achtung. Dadurch werden Basis-Images entfernt, die vor Wochen erstellt wurden, aber möglicherweise von Ihren neuen Images verwendet werden.

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

2
Antony.H

So entfernen Sie ein markiertes Bild

  1. docker rmi das Tag zuerst 

  2. docker rmi das Bild. 

    # Dies kann in einem Docker-RMI-Aufruf durchgeführt werden, z. B. # Docker-Rmi <Repo: Tag> <Imageid>

(das funktioniert im November 2016, Docker Version 1.12.2)

z.B.

$ 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

z.B. Entfernen Sie alles, was älter als 2 Wochen ist.

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 hat schon eine sehr schöne Antwort gegeben, aber der Vollständigkeit halber habe ich ein kleines Skript verwendet, das ich verwendet habe - und das auch alle möglichen Docker-Prozesse in Frage stellt:

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

docker system Prune -a

(Sie werden aufgefordert, den Befehl zu bestätigen. Verwenden Sie -f, um die Ausführung zu erzwingen, wenn Sie wissen, was Sie tun.)

2
Vojtech Vitek

Um markierte Bilder zu entfernen, bei denen kein Container aktiv ist, müssen Sie ein kleines Skript verwenden:

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

oder 

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

Wenn Sie vorhandene Container automatisch/in regelmäßigen Abständen bereinigen und Images und Volumes entfernen möchten, die nicht von einem aktiven Container verwendet werden, können Sie das Image meltwater/docker-cleanup herunterladen.

Renn einfach:

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

Es wird standardmäßig alle 30 Minuten ausgeführt. Sie können die Verzögerungszeit jedoch mit diesem Flag in Sekunden einstellen (Option DELAY_TIME = 1800).

Weitere Details: https://github.com/meltwater/docker-cleanup/blob/master/README.md

1
Innocent Anigbo

Alle Bilder und Volumes auch beschneiden
docker system Prune -af --volumes

0
Zaytsev Dmitry

Gelegentlich sind Probleme aufgetreten, bei denen Docker Speicherplatz zuweist und weiterhin verwendet, auch wenn der Speicherplatz keinem bestimmten Image oder einem vorhandenen Container zugeordnet ist. Die neueste Methode, aus der ich dieses Problem versehentlich generiert habe, war die Verwendung von Centos build "docker-engine" anstelle von "docker" in RHEL 7.1. Was scheinbar passiert, ist, dass die Container-Bereinigungen manchmal nicht erfolgreich abgeschlossen werden und der Speicherplatz dann nie wieder verwendet wird. Als das 80-GB-Laufwerk, das ich als/mit/var/lib/docker-Dateien gefüllt hatte, zugeteilt wurde, musste ich einen kreativen Weg finden, um das Problem zu lösen. 

Hier ist was ich mir ausgedacht habe. Zuerst den Festplattenfehler auflösen:

  1. Docker anhalten: systemctl Docker anhalten
  2. Ein neues Laufwerk wurde als say/mnt/docker bereitgestellt.
  3. Verschieben Sie alle Dateien in/var/lib/docker nach/mnt/docker. Ich habe den Befehl verwendet: rsync -aPHSx --remove-source-files/var/lib/docker// mnt/docker /
  4. Mounten Sie das neue Laufwerk in/var/lib/docker.

Zu diesem Zeitpunkt hatte ich keinen Festplattenfehler mehr, verschwendete jedoch immer noch sehr viel Speicherplatz. Die nächsten Schritte sind, sich darum zu kümmern.

  1. Docker starten: Systemctl Start Docker

  2. Speichern Sie alle Bilder: Docker save $ (docker images | sed -e '/ ^/d' -e '/ ^ REPOSITORY/d' -e 's, [] [],:,' - e 's, []. ,')> /root/docker.img

  3. Docker deinstallieren.

  4. Löschen Sie alles in /var/lib/docker:rm -rf/var/lib/docker/[cdintv] *

  5. Installieren Sie das Docker erneut

  6. Docker aktivieren: Systemctl aktivieren Docker

  7. Docker starten: Systemctl Docker starten

  8. Wiederherstellen von Bildern: Docker laden </root/docker.img

  9. Starten Sie alle permanenten Container, die Sie ausführen müssen.

Dadurch sank meine Festplattennutzung von 67 GB für Docker auf 6 GB für Docker.

Ich empfehle das nicht für den täglichen Gebrauch. Die Ausführung ist jedoch sinnvoll, wenn es so aussieht, als hätte das Docker aufgrund von Softwarefehlern oder unerwarteten Neustarts den belegten Speicherplatz verloren.

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

Es gibt ein Sparrow-Plugin docker-remove-dangling-images , mit dem Sie angehaltene Container und ungenutzte (baumelnde) Bilder bereinigen können:

$ sparrow plg run docker-remove-dangling-images

Es funktioniert sowohl für Linux als auch für Windows.

0
Alexey Melezhik

Führen Sie zuerst docker images aus, um eine Liste der Bilder anzuzeigen und die IMAGE HASH ID in die Zwischenablage zu kopieren.

docker rmi -f <Image> ausführen

Denken Sie daran, dass die Option -f das Löschen erzwingt.

0
Le Khiem