Co to jest obraz wiszący, a co nieużywany?

155

W dokumentacji dockera na temat docker image prune można użyć flagi -a do

Usuń wszystkie nieużywane obrazy, nie tylko wiszące

i później

Usuń wszystkie wiszące obrazy. Jeśli podano -a, usunie również wszystkie obrazy, do których żaden kontener nie ma odniesienia.

Czy ktoś może mi wyjaśnić, czym są wiszące obrazy i jaka jest różnica między wiszącymi a nieużywanymi obrazami?

herm
źródło
docker image prune (bez -a) robi jednak dokładnie to samo
herm
Nie powiedzie się, gdy użyjesz tego w jenkins, utracimy kopię zapasową dockera w produkcji, jeśli będziemy zależni od pamięci podręcznej obrazu docker. prunenie jest polecany w produkcji /
Jinna Balu

Odpowiedzi:

153

Nieużywany obraz oznacza, że ​​nie został przypisany ani używany w kontenerze. Na przykład podczas uruchamiania docker ps -a- wyświetli listę wszystkich zamkniętych i aktualnie uruchomionych kontenerów. Wszystkie obrazy używane w dowolnym z kontenerów są „obrazami używanymi”.

Z drugiej strony wiszący obraz oznacza po prostu, że utworzyłeś nową wersję obrazu, ale nie nadano mu nowej nazwy. Tak więc stare obrazy, które masz, stają się „wiszącym obrazem”. Te stare obrazy to te, które są nieoznakowane i wyświetlają się <none>w nazwie „ ” po uruchomieniu docker images.

Po uruchomieniu docker system prune -ausunie zarówno nieużywane, jak i wiszące obrazy. Dlatego NIE będzie to miało wpływu na obrazy używane w kontenerze, niezależnie od tego, czy zostały one zamknięte, czy są obecnie uruchomione.

Serey
źródło
Zgodnie z dokumentacją podczas uruchamiania docker prune bez -a usuwane są tylko wiszące obrazy. -a zapewni, że nieużywane obrazy również zostaną usunięte, prawda? docs.docker.com/engine/reference/commandline/system_prune
herm
1
Bardzo interesujące. Tak więc wiszący obraz może być używany przez kontener. Uwaga: Docker ostrzega, jeśli istnieją jakiekolwiek kontenery, które używają tych nieoznakowanych obrazów.
herm
7
docker system prune --all --filter "until=24h"zachowuje również najnowsze obrazy
Harry Moreno,
1
Według docs.docker.com/engine/reference/commandline/system_prune/ ... docker system prune -a usuwa również zatrzymane kontenery. Powinien więc również usunąć obrazy powiązane tylko z opuszczonymi kontenerami, prawda?
Lfk
41

Najbezpieczniejszy i najłatwiejszy sposób czyszczenia wiszących obrazów

docker images --quiet --filter=dangling=true | xargs --no-run-if-empty docker rmi

Obrazy platformy Docker składają się z wielu warstw. Obrazy wiszące to warstwy, które nie mają żadnego związku z żadnymi oznaczonymi obrazami. Nie służą już żadnemu celowi i zajmują miejsce na dysku.

Uwaga: Zalecam nie używać prunew produkcji, ponieważ docker system prune -ausunie wszystkie obrazy, do których kontener nie ma odniesienia, przez co nie możemy cofnąć się do poprzedniej wersji.

Aby wyświetlić wiszące obrazy, dodając flagę filtru -fz wartością dangling=truedo docker images.

Wyświetl listę wiszących obrazów

docker images -f dangling=true

Usuń wiszące obrazy

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

LUB

docker images --quiet --filter=dangling=true | xargs --no-run-if-empty docker rmi

Kiedy uruchamiamy jakiekolwiek zadania crona, aby usunąć wiszące rzeczy, użyj powyższego, aby upewnić się, że zadanie działa pomyślnie. Podobnie jak w Jenkinsie, jeśli wykonujemy pracę w wolnym stylu z poniższą pracą Commad, nigdy nie zakończy się niepowodzeniem, nawet jeśli w maszynie nie ma żadnych wiszących rzeczy.

Jest to najbezpieczniejszy i najłatwiejszy sposób na wyczyszczenie wiszących obrazów i odzyskanie miejsca na dysku do użytku.

Jinna Balu
źródło
2
a co z przycinaniem obrazu docker? Dokumenty mówią: „Usuń wszystkie wiszące obrazy. Jeśli podano -a, usunie również wszystkie obrazy, do których żaden kontener nie ma odniesienia”. docs.docker.com/engine/reference/commandline/image_prune/ ...
herm
2
@herm, na dole strony, do której się odwołałeś „Uwaga: zostaniesz poproszony o potwierdzenie, zanim śliwka cokolwiek usunie, ale nie jest wyświetlana lista elementów, które mogą zostać usunięte”. Myślę, że celem tej odpowiedzi jest to, że możesz uzyskać listę wiszących obrazów, które następnie wyraźnie określisz jako usunięte, w przeciwieństwie do ślepego usuwania wszystkich wiszących obrazów za pomocą śliwki.
bzier
Obrazy z nazwą i tagiem, których nie ma w docker imagesśrodku, są zawieszone. Jak sprawdzić ich rozmiar? Obrazy, które nie mają nazwy i tagu, docker images -asą również obrazami pośrednimi. Czy można je usunąć i jak sprawdzić ich rozmiar?
zmienna
17

Do obrazów w dockerze odwołuje się skrót sha256, często nazywany identyfikatorem obrazu. To podsumowanie to wszystko, czego potrzebujesz, aby obraz istniał na hoście Dockera. Zazwyczaj będziesz mieć tagi wskazujące na te skróty, np. Tag busybox: najnowsze bieżące wskazuje na identyfikator obrazu c30178c523 ... w moim systemie. Wiele tagów może wskazywać na ten sam obraz, a każdy tag można zmienić tak, aby wskazywał na inny identyfikator, np. Podczas pobierania nowej kopii busybox: najnowszy lub tworzenia nowej wersji obrazu aplikacji.

Obrazy wiszące to obrazy, które nie mają tagu i nie mają obrazu podrzędnego (np. Starego obrazu, który używał innej wersji FROM busybox:latest), wskazującego na nie. Mogli mieć już wcześniej wskazujący na nie tag, który później się zmienił. Albo mogli nigdy nie mieć tagu (np. Wyjście a docker buildbez opcji tagu). Zazwyczaj można je bezpiecznie usunąć, o ile nie są jeszcze uruchomione żadne kontenery odwołujące się do starego identyfikatora obrazu. Głównym powodem, dla którego warto je trzymać, jest buforowanie kompilacji.

Ponadto możesz pobrać obrazy, które nie są obecnie używane przez kontenery (w tym zatrzymane kontenery). Różnią się one całkowicie od wiszących obrazów i mogą być bezpieczne do usunięcia, o ile nie planujesz ich używać w przyszłości lub nie masz nic przeciwko pobieraniu kolejnej kopii, gdy ich potrzebujesz.

BMitch
źródło
Kiedy kompilacja Dockera jest uruchomiona (proces, w którym tworzy warstwy i potencjalnych kandydatów na przyszłe wiszące obrazy), czy w nowym oknie uruchomię czyszczenie obrazu Dockera, czy wpłynie to w jakikolwiek sposób na trwającą kompilację?
zmienna
@variable może tam wystąpić sytuacja wyścigu, ale zazwyczaj działający kontener dla etapu kompilacji spowoduje, że obraz zostanie zidentyfikowany jako używany. Najgorsze, co może się zdarzyć, to albo śliwka zgłasza błąd, albo kompilacja i trzeba będzie ją ponownie uruchomić. Sprawdzę, czy możesz ograniczyć przycinanie, aby uniknąć obrazów, których obecnie używasz do budowania, ponieważ udane przycinanie spowoduje, że przyszłe kompilacje będą musiały ponownie pobrać obrazy.
BMitch
Czy obrazy pośrednie (te, które nie mają nazwy / tagu wyświetlanego po uruchomieniu docker images -a) są również nazywane wiszącymi obrazami? Czy są usuwane za pomocą przycinania obrazu Dockera?
zmienna
Nie mam ich już w swoim środowisku (używając tutaj zestawu buildkit), więc polecam wypróbowanie się w środowisku laboratoryjnym, aby zobaczyć, co się stanie.
BMitch
To powiedziawszy, usuwanie nieoznakowanych „obrazów” z etapów pośrednich jest raczej bezcelowe, chyba że usuniesz ostateczny oznaczony obraz, wszystkie warstwy zostaną ponownie użyte w późniejszym obrazie i nie można ich usunąć. Jeśli je usuniesz, zniszczysz pamięć podręczną kompilacji i spowoduje, że wszystkie przyszłe obrazy będą wymagały więcej czasu na kompilację i miejsce na dysku do przechowywania.
BMitch
5

Obrazy wiszące to warstwy, które nie mają żadnego związku z żadnymi oznaczonymi obrazami. Nie służą już żadnemu celowi i zajmują miejsce na dysku.

Nieużywany obraz to obraz, który nie został przypisany ani nie był używany w kontenerze.

Wyświetl listę wiszących obrazów

docker images -f dangling=true
subh2273
źródło
3

wiszące obrazy to obrazy bez tagów. Następujące polecenie wyświetla listę wiszących obrazów.

docker images --filter "dangling=true"

docker image prune usuwa wszystkie wiszące obrazy.

Nieużywane obrazy to obrazy, które mają tagi, ale obecnie nie są używane jako kontener. Możesz go potrzebować w przyszłości lub nie.

docker image prune -a usuń wszystkie wiszące i nieużywane obrazy.

Zazwyczaj nie chcesz usuwać wszystkich nieużywanych obrazów do pewnego czasu. Dlatego lepiej jest usunąć za pomocą filtra.

docker image prune -f --filter "until=6h"

Venkat Kotra
źródło
1) Czy docker image prune -a -f --filter "until=6h"usuwa również wiszące obrazy?
zmienna
2) W ostatnim poleceniu wspominasz docker image prune -f --filter "until=6h"- skoro nie ma -a - to dlaczego usunie nieużywane obrazy?
zmienna
0

Widziałem przydatne polecenia (aliasy) do usuwania wiszących obrazów, dzięki uprzejmości andyneff tutaj: https://forums.docker.com/t/how-to-delete-cache/5753 :

alias docker_clean_images='docker rmi $(docker images -a --filter=dangling=true -q)' 
alias docker_clean_ps='docker rm $(docker ps --filter=status=exited --filter=status=created -q)' 

Pierwsza czyści wszystkie wiszące obrazy. Jest to przydatne do usuwania obrazów pośrednich pozostałych z wielu kompilacji. Drugi służy do usuwania zatrzymanych pojemników. To są aliasy, których używam do rutynowej konserwacji

Jeśli chcesz usunąć CAŁĄ pamięć podręczną, musisz najpierw upewnić się, że wszystkie kontenery są zatrzymane i usunięte, ponieważ nie możesz usunąć obrazu używanego przez kontener. Więc coś podobnego

docker kill $(docker ps -q) docker_clean_ps docker rmi $(docker images
-a -q)

Spowoduje to zabicie i usunięcie wszystkich obrazów w pamięci podręcznej.

Alexei Martianov
źródło
0

Na zrzucie ekranu obrazy „brak” nazwy są wiszącymi obrazami. Wiszący obraz oznacza po prostu, że utworzyłeś nową wersję obrazu, ale nie nadano mu nowej nazwy. Tak więc stare obrazy, które masz, stają się „wiszącym obrazem”. Te stare obrazy to te, które są nieoznakowane i wyświetlają się w nazwie „” po uruchomieniu obrazów Dockera.

docker system prune -a, usunie zarówno nieużywane, jak i wiszące obrazy. Dlatego NIE będzie to miało wpływu na żadne obrazy używane w kontenerze, niezależnie od tego, czy zostały one zamknięte, czy są aktualnie uruchomione.

Nirbhay Singh
źródło