Aktualizacja września 2016: Docker 1.13: PR 26108 i zatwierdzenie 86de7c0 wprowadzają kilka nowych poleceń, aby ułatwić wizualizację, ile miejsca zajmują dane demona dokera na dysku i pozwalając na łatwe usunięcie „niepotrzebnego” nadmiaru.
docker system prune
usunie WSZYSTKIE wiszące dane (tzn. W kolejności: pojemniki zatrzymane, woluminy bez pojemników i obrazy bez pojemników). Nawet nieużywane dane, z -a
opcją.
Masz także:
W przypadku nieużywanych obrazów użyj docker image prune -a
(do usuwania wiszących i nieskróconych obrazów).
Ostrzeżenie: „ nieużywany ” oznacza „obrazy, do których nie odwołuje się żaden pojemnik”: przed użyciem należy zachować ostrożność -a
.
Jak pokazano na AL „s odpowiedzi , docker system prune --all
usunie wszystkie nieużywane obrazy nie tylko zwisające z nich ... co może być trochę za dużo.
Połączenie docker xxx prune
z --filter
opcją może być świetnym sposobem na ograniczenie przycinania ( dokerujące SDK API 1.28 minimum, więc dokerowane 17.04+ )
Aktualnie obsługiwane filtry to:
until (<timestamp>)
- usuwaj tylko pojemniki, obrazy i sieci utworzone przed określonym znacznikiem czasu
label
( label=<key>
, label=<key>=<value>
, label!=<key>
, Lub label!=<key>=<value>
) - tylko usunąć pojemniki, obrazów, sieci i woluminów z (lub bez , w przypadek label!=...
jest używany) określonych etykiet.
Zobacz przykład „ Przycinaj obrazy ”.
Oryginalna odpowiedź (wrzesień 2016)
Zwyklę robię:
docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
Mam alias do usuwania tych [wiszących obrazów] 13 :drmi
dangling=true
Filtr wyszukuje nieużywane obrazów
W ten sposób usuwany jest każdy obraz pośredni, do którego nie ma już obrazu z etykietą.
To samo robię najpierw dla zakończonych procesów (kontenerów)
alias drmae='docker rm $(docker ps -qa --no-trunc --filter "status=exited")'
Jak wskazuje haridsv w komentarzach :
Technicznie rzecz biorąc, najpierw należy wyczyścić pojemniki przed czyszczeniem obrazów, ponieważ spowoduje to złapanie większej liczby wiszących obrazów i mniej błędów .
Jess Frazelle (jfrazelle) ma funkcję 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
}
Aby usunąć stare obrazy, a nie tylko obrazy „wiszące bez odniesienia”, możesz rozważyć docker-gc
:
Prosty skrypt Docker do kontenerów i usuwania śmieci.
- Pojemniki, które opuściły ponad godzinę temu, są usuwane.
- Obrazy, które nie należą do żadnego pozostałego pojemnika po tym, są usuwane.
"dangling=true"
tak naprawdę oznacza?dcleanup
jest niesamowite!docker system prune
usuwa znacznie więcej niż tylko obrazy. Pamiętaj, aby użyćdocker image prune
zamiast tego. I bądź bardzo ostrożny z-a
: adocker system prune -a
może mieć niszczycielski efekt (także usuwanie objętości). Wreszcie tak,-a
usuwa nieużywane obrazy, edytuję odpowiedź.Zaktualizuj drugi (2017-07-08):
Odwołaj się (ponownie) do VonC, korzystając z jeszcze nowszej wersji
system prune
. Niecierpliwy może pominąć monit z-f, --force
opcją:Niecierpliwi i lekkomyślni mogą dodatkowo usunąć „nieużywane obrazy, nie tylko wiszące” z
-a, --all
opcją:https://docs.docker.com/engine/reference/commandline/system_prune/
Aktualizacja:
Zobacz odpowiedź VonC, która korzysta z ostatnio dodanych
prune
poleceń. Oto odpowiedni dogodny alias powłoki:Stara odpowiedź:
Usuń zatrzymane (opuszczone) kontenery:
Usuń nieużywane (wiszące) obrazy:
Jeśli zachowałeś szczególną ostrożność w odniesieniu do nieodwołalnej utraty danych , możesz usunąć nieużywane (wiszące) woluminy (wer. 1.9 i nowsze):
Oto one w wygodnym aliasie powłoki:
Bibliografia:
docker ps -f
docker rm
docker images -f
docker rmi
docker volume ls
docker volume rm
źródło
docker volume rm
przepisu. Będę wdzięczny za wszelkie sugestie.docker volume ls -qf dangling=true | egrep '^[a-z0-9]{64}$' | xargs --no-run-if-empty docker volume rm
będzie działać, o ile nigdy nie nazwiesz swoich woluminów czymś podobnym do przewodnika. Mogę dostosować to do nowej składni filtra.Aby usunąć stare oznaczone zdjęcia, które mają więcej niż miesiąc:
Zauważ, że nie uda się usunąć obrazów używanych przez kontener, do których odwołuje się repozytorium, ma zależne obrazy potomne ... co prawdopodobnie jest tym, czego chcesz. W przeciwnym razie po prostu dodaj
-f
flagę.Przykład
/etc/cron.daily/docker-gc
skryptu:źródło
.CreatedSince
wykorzystuje tygodnie jako jednostkę czasu w danych wyjściowych, nawet w przypadku obrazów, które mają wiele tygodni, np12 weeks
.docker images | grep ' months' | awk '{ print $3 }' | xargs --no-run-if-empty docker rmi -f
Inne odpowiedzi są świetne, w szczególności:
Ale potrzebowałem czegoś w środku dwóch poleceń, więc
filter
potrzebowałem tej opcji:Mam nadzieję, że to pomoże :)
W celach informacyjnych: https://docs.docker.com/config/pruning/#prune-images
źródło
Zakładając, że masz Docker 1.13 lub wyższy, możesz po prostu użyć poleceń przycinania. Na swoje pytanie dotyczące usuwania starych obrazów potrzebujesz pierwszego.
Polecam nie przyzwyczaić się do korzystania z
docker system prune
polecenia. Sądzę, że użytkownicy przypadkowo usuną rzeczy, których nie zamierzają. Osobiście zamierzam używać głównie poleceńdocker image prune
idocker container prune
.źródło
docker system prune
innych suszonych śliwek.Do tej pory (wersja Docker 1.12) używamy następującego polecenia, aby usunąć wszystkie działające kontenery. Ponadto, jeśli chcemy usunąć woluminy, możemy to zrobić ręcznie, używając odpowiedniego znacznika -v w następującym poleceniu.
Usuń wszystkie opuszczone kontenery
Usuń wszystkie zatrzymane pojemniki
Usuń wszystkie uruchomione i zatrzymane pojemniki
Usuń wszystkie pojemniki bez żadnych kryteriów
Ale w wersji 1.13 i nowszych do pełnego systemu i czyszczenia możemy bezpośrednio użyć następującego polecenia:
Wszystkie nieużywane pojemniki, obrazy, sieci i woluminy zostaną usunięte. Możemy to również zrobić za pomocą następujących poleceń, które oczyszczają poszczególne komponenty:
źródło
To działało dla mnie:
źródło
Następujące polecenie usunie obrazy starsze niż 48 godzin.
źródło
docker image ls --all --filter reference=monolito --filter before=monolito:0.1.8
a następnie zastosować polecenie rmi, aby usunąć.docker rmi $(docker image ls -q --all --filter reference=monolito --filter before=monolito:0.1.8)
Niedawno napisałem skrypt, aby rozwiązać ten problem na jednym z moich serwerów:
źródło
Oto skrypt do czyszczenia obrazów Docker i odzyskania przestrzeni.
Oryginalny skrypt
https://github.com/vishalvsh1/docker-image-cleanup
Zazwyczaj Docker przechowuje wszystkie pliki tymczasowe związane z budowaniem obrazu i warstwami
/ var / lib / docker
Ta ścieżka jest lokalna dla systemu, zwykle na partycji root „/” .
Możesz zamontować większą przestrzeń dyskową i przenieść zawartość
/var/lib/docker
do nowej lokalizacji montowania oraz utworzyć dowiązanie symboliczne.W ten sposób, nawet jeśli obrazy Dockera zajmą miejsce, nie wpłynie to na twój system, ponieważ będzie on używał innej lokalizacji montowania.
Oryginalny post: Zarządzaj obrazami Dockera na dysku lokalnym
źródło
Używam tego polecenia:
Spowoduje to usunięcie wszystkich zdjęć, których czas tworzenia jest dłuższy niż 10 tygodni temu.
źródło
IMAGE_CTIME
iBEFORE_DATETIME
w tymecho
poleceniuJeśli chcesz usunąć obrazy wyciągnięte X miesięcy temu, możesz wypróbować poniższy przykład, który usuwa obrazy utworzone trzy miesiące temu:
źródło
Aby przyciąć również wszystkie obrazy i tomy
docker system prune -af --volumes
źródło
docker system prune -a
(Zostaniesz poproszony o potwierdzenie polecenia. Użyj,
-f
aby wymusić bieg, jeśli wiesz, co robisz).źródło
docker system prune
usuwania nawet nazwanych woluminów za pomocą-a
.@VonC już udzielił bardzo ładnej odpowiedzi, ale dla kompletności tutaj jest mały skrypt, którego używałem --- i który również nukuje wszelkie polecenia Dockera, jeśli masz jakieś:
źródło
Error response from daemon: You cannot remove a running container
. Dodanodocker kill $(docker ps -q)
przed linią 3 do adresu$(docker images -q)
zamiast$(docker images | awk '/<none>/ { print $3 }')
?docker images -q
, dostanę wektor identyfikatorów obrazów, nic więcej. Jeśli robię to, co robię, dostaję więcej - pozwalając mi się filtrować<none>
tak jak tutaj. Ma sens?Aby usunąć oznaczone obrazy, które nie mają uruchomionego kontenera, będziesz musiał użyć małego skryptu:
źródło
Usuń stare pojemniki tygodnie temu.
docker rm $(docker ps -a | grep "weeks" | awk '{ print $1; }')
Usuń stare zdjęcia kilka tygodni temu. Bądź ostrożny. Spowoduje to usunięcie podstawowych obrazów, które zostały utworzone tygodnie temu, ale z których mogą korzystać Twoje nowe obrazy.
docker rmi $(docker images | grep 'weeks' | awk '{ print $3; }')
źródło
Jak usunąć oznaczony obraz
docker najpierw rmi tag
doker rmi obraz.
#, które można wykonać w jednym wywołaniu rmi dokera, np .: # doker rmi <repo: tag> <imageid>
(działa to w listopadzie 2016 r., wersja Docker 1.12.2)
na przykład
np. Skrypty usuwają wszystko starsze niż 2 tygodnie.
źródło
-f siła
-wszystko
-q w trybie
źródło
lub
źródło
Czasami napotykałem problemy, w których Docker przydziela i nadal wykorzystuje miejsce na dysku, nawet gdy miejsce to nie jest przydzielone do żadnego konkretnego obrazu ani istniejącego kontenera. Ostatnim sposobem, w jaki przypadkowo wygenerowałem ten problem, było użycie kompilacji centos „docker-engine” zamiast „docker” w RHEL 7.1. Wydaje się, że czasami zdarza się, że czyszczenie kontenerów nie kończy się pomyślnie, a wtedy przestrzeń nigdy nie jest ponownie wykorzystywana. Kiedy dysk o pojemności 80 GB przydzielony jako / został wypełniony plikami / var / lib / docker, musiałem wymyślić kreatywny sposób rozwiązania problemu.
Oto, co wymyśliłem. Najpierw usuń błąd pełnego dysku:
W tym momencie nie miałem już błędu pełnego dysku, ale wciąż marnowałem ogromną ilość miejsca. Następne kroki to załatwić.
Uruchom Docker: systemctl start docker
Zapisz wszystkie obrazy: doker zapisz $ (obrazy dokera | sed -e '/ ^ / d' -e '/ ^ REPOSITORY / d' -e 's, [] [] ,:, „-e' s, [ ]. ,, ')> /root/docker.img
Odinstaluj okno dokowane.
Usuń wszystko w / var / lib / docker: rm -rf / var / lib / docker / [cdintv] *
Ponownie zainstaluj okno dokowane
Włącz okno dokowane: systemctl włącz okno dokowane
Uruchom okno dokowane: systemctl uruchom okno dokowane
Przywróć obrazy: ładowanie dokera </root/docker.img
Uruchom dowolne trwałe kontenery, które potrzebujesz uruchomić.
To zmniejszyło użycie mojego dysku z 67 GB dla dokera do 6 GB dla dokera.
Nie polecam tego do codziennego użytku. Przydatne jest jednak uruchamianie, gdy wygląda na to, że doker stracił pamięć zajmowanego miejsca na dysku, powodując błędy oprogramowania lub nieoczekiwane ponowne uruchomienie.
źródło
Jeśli chcesz automatycznie / okresowo czyścić opuszczone kontenery i usuwać obrazy i woluminy, które nie są używane przez działający kontener, możesz pobrać obraz
meltwater/docker-cleanup
.Po prostu biegnij:
Domyślnie działa co 30 minut. Możesz jednak ustawić czas opóźnienia za pomocą tej flagi w sekundach (opcja DELAY_TIME = 1800).
Więcej informacji: https://github.com/meltwater/docker-cleanup/blob/master/README.md
źródło
Jeśli tworzysz te przycięte obrazy samodzielnie (z niektórych innych, starszych obrazów podstawowych), uważaj na powyższe zaakceptowane rozwiązania
docker image prune
, ponieważ polecenie jest tępe i spróbuje usunąć również wszystkie zależności wymagane przez twoje najnowsze obrazy (polecenie powinno być prawdopodobnie zmieniono jego nazwę nadocker image*s* prune
).Rozwiązanie, które wymyśliłem dla moich potoków kompilacji obrazu dokera (gdzie istnieją codzienne kompilacje i tagi = daty są w
YYYYMMDD
formacie), jest następujące:źródło
Istnieje wróbel plugin docker-remove-dangling-images, którego można użyć do czyszczenia zatrzymanych pojemników i nieużywanych (zwisających) obrazów:
$ sparrow plg run docker-remove-dangling-images
Działa zarówno w systemie Linux, jak i Windows.
źródło
Najpierw biegnij,
docker images
aby zobaczyć listę obrazów i skopiuj IMAGE HASH ID do schowka.Biegać
docker rmi -f <Image>
Pamiętaj, że opcja
-f
wymusza usunięcie.źródło