Jak mogę usunąć obrazy Dockera?

265

Mam następujące obrazy:

alex@alexvps:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
<none>              <none>              70c0e19168cf        5 days ago          1.069 GB
<none>              <none>              c2ce80b62174        8 days ago          399.2 MB
<none>              <none>              60afe4036d97        8 days ago          325.1 MB

a kiedy próbuję usunąć jeden z nich, otrzymuję:

alex@alexvps:~$ sudo docker rmi 60afe4036d97
Error: Conflict, 60afe4036d97 wasn't deleted
2014/01/28 00:54:00 Error: failed to remove one or more images

Jak mogę je usunąć? Dlaczego jest taki konflikt?

alexyz78
źródło

Odpowiedzi:

478

Aby usunąć wszystkie obrazy, użyj podanego polecenia

docker rmi $(docker images -q)

Aby usunąć wszystkie kontenery, użyj podanego polecenia

docker rm $(docker ps -a -q)

Ostrzeżenie: zniszczy to wszystkie twoje obrazy i pojemniki. Nie będzie można ich przywrócić!

To rozwiązanie zapewnia Techoverflow.net .

Słoneczny
źródło
17
Prosty i prosty. Również poniżej polecenia, aby wymusić usunięcie obrazów. „
docker rmi
37
Odpowiednikiem Windows PowerShell jestdocker images -q | %{docker rmi -f $_}
BeatingToADifferentRobot
1
Najpierw użyłem cmd na @muheed How to Answer ( stackoverflow.com/a/30475249/2747020 ), aby odblokować usunięcie niektórych zdjęć:sudo docker ps -a -q | xargs -n 1 -I {} sudo docker rm {}
Razec Luar
1
Windows PowerShell dla kontenerów dokerówdocker ps -a -q | %{docker rm -f $_}
Dexter
1
Jak zauważa poniżej @ alexyz78, możesz teraz używać docker system prune. Więc wytrzyj wszystko: docker kill $(docker ps -q)aby zatrzymać pojemniki, a następnie docker system prune -ausunie wszystko - patrz stackoverflow.com/a/44309011/247708
Bharat
101

Możliwy powód: Przyczyną może być to, że ten obraz jest aktualnie używany przez działający kontener. W takim przypadku możesz wyświetlić listę uruchomionych kontenerów, zatrzymać odpowiedni kontener, a następnie usunąć obraz:

docker ps
docker stop <containerid>
docker rm <containerid>
docker rmi <imageid>

Jeśli nie możesz znaleźć kontenera za pomocą dokera ps, możesz użyć tego, aby wyświetlić listę wszystkich już opuszczonych kontenerów i usunąć je.

docker ps -a | grep 60afe4036d97
docker rm <containerid>

Uwaga: w przypadku korzystania z kontenerów należy zachować ostrożność, usuwając jednocześnie wszystkie opuszczone Volume-Onlypojemniki. Pozostają one w Exitstanie, ale zawierają przydatne dane .

Jiri
źródło
W rzeczywistości dostaniesz komunikat określający to. Może inny obraz jest oparty na tym? Najpierw spróbuj usunąć wszystkie obrazy utworzone z tego obrazu.
qkrijger
12
Byłem w stanie usunąć obraz za pomocą sudo docker ps -a | grep Exit | awk '{print $1}' | sudo xargs docker rm(dzięki github.com/dotcloud/docker/issues/3258 ), a następnie zsudo docker rmi 70c0e19168cf
alexyz78
2
Ostrożnie usuwaj obrazy w Exitstanie. Jeśli korzystasz z kontenerów zawierających tylko wolumin danych, nie działają one nadal.
aceofspades
1
awk może grep:awk '/Exit/ {print $1}'
Dwight Spencer
Twoje polecenia to rzucają Error response from daemon: No such container: .... Trudno powiedzieć, co należy wymienić i co powinienem zastąpić. Nie używaj...
Felo Vilches
60

Przyczyną tego błędu jest to, że chociaż obraz nie ma żadnego znacznika, nadal istnieje kontener utworzony na tym obrazie, który może być w exitedstanie. Musisz więc upewnić się, że zatrzymałeś i usunąłeś wszystkie kontenery utworzone na tych obrazach. Poniższe polecenie pomaga usunąć wszystkie nie uruchomione kontenery:

docker rm `docker ps -aq --no-trunc --filter "status=exited"`

Teraz usuwa wszystkie wiszące <none>obrazy niebezpośrednie :

docker rmi `docker images --filter 'dangling=true' -q --no-trunc`

Uwaga: Aby zatrzymać wszystkie działające kontenery:

docker stop `docker ps -q`
Eldos
źródło
1
Dziękuję za to, uważam, że jest to najczystsza implementacja.
Joseph Sawyer,
7
Zachowaj ostrożność, jeśli masz pojemniki woluminu danych, ponieważ mają one „status = zakończony”. Oznacza to, że stracisz wszystkie swoje dane.
Johan
19

Obraz może być obecnie używany przez działający kontener, więc najpierw musisz zatrzymać i usunąć kontener (y).

docker stop <container-name>
docker rm <container-id>

Następnie możesz spróbować usunąć obraz:

docker rmi <image-id>

Musisz być pewien, że ten obraz nie zależy od innych obrazów (w przeciwnym razie musisz je najpierw usunąć).

Miałem dziwny przypadek, w którym nie miałem już żadnych kontenerów ( docker ps -anic nie zwróciłem), ale nie udało mi się usunąć obrazu i jego zależności od obrazu.

Aby rozwiązać te specjalne przypadki, możesz wymusić usunięcie obrazu w ten sposób:

docker rmi -f <image-id>
madx
źródło
19

W Bash:

for i in `sudo docker images|grep \<none\>|awk '{print $3}'`;do sudo docker rmi $i;done

Spowoduje to usunięcie wszystkich obrazów o nazwie „<brak>”. Te obrazy były zbędne.

Marcell
źródło
3
To nie odpowiada na pytanie, ale wciąż jest bardzo przydatne. Dzięki.
binwiederhier
5
uprość to polecenie docker images|grep \<none\>|awk '{print $3}' | xargs docker rmi, może potrzebować sudopozwolenia
Larry Cai
15

Znalazłem odpowiedź w tym poleceniu:

docker images --no-trunc | grep none | awk '{print $3}' | xargs docker rmi

Miałem twój problem, kiedy usunąłem niektóre obrazy, które były używane, i nie zdawałem sobie sprawy (używałem docker ps -a).

iwangoblin
źródło
9

Od wersji Docker 1.13.0 (styczeń 2017) jest system prunepolecenie:

$ docker system prune --help

Usage:  docker system prune [OPTIONS]

Remove unused data

Options:
-a, --all     Remove all unused images not just dangling ones
-f, --force   Do not prompt for confirmation
    --help    Print usage
alexyz78
źródło
7

Oprócz odpowiedzi Sunny:

Aby usunąć wszystkie obrazy na komputerze z systemem Windows (z Docker dla Windows) w oknie programu PowerShell:

docker images -q | %{docker rmi -f $_}

Aby usunąć wszystkie kontenery na komputerze z systemem Windows (z Docker dla Windows) w oknie PowerShell:

docker ps -a -q | %{docker rm -f $_}
Paul Vogel
źródło
6

Najpierw usuń wszystkie pojemniki za pomocą następującego polecenia

sudo docker ps -a -q | xargs -n 1 -I {} sudo docker rm {}

Następnie usuń obraz według jego identyfikatora za pomocą następującego polecenia

sudo docker rmi <image-id>
Muheed
źródło
Warto zauważyć, że w przypadku niektórych nie jest to oczywiste, że spowoduje to usunięcie wszystkich działających kontenerów Docker.
Michael Mior,
4

Najpierw musisz zatrzymać / usunąć wszystkie niepotrzebne pojemniki utworzone na tych obrazach.

Zobacz: Jak usunąć stare kontenery Docker .

Następnie użyj rozwiązania @marcell.

tgrigoryan
źródło
4

Usuń wszystkie pojemniki

docker ps -q -a | xargs docker rm

Wymuś usunięcie wszystkich obrazów Dockera

docker rmi -f $(docker images -f dangling=true -q)
Wszystko to
źródło
4

Po prostu możesz dodać --forcena końcu polecenia. Lubić:

sudo docker rmi <docker_image_id> --force

Aby uczynić go bardziej inteligentnym , możesz dodać jako:

sudo docker stop $(docker ps | grep <your_container_name> | awk '{print $1}')

sudo docker rm $(docker ps | grep <your_container_name> | awk '{print $1}')

sudo docker rmi $(docker images | grep <your_image_name> | awk '{print $3}') --force

Tutaj w docker ps1 $ jest pierwsza kolumna, tj. Identyfikator kontenera Docker.

A docker images3 USD to trzecia kolumna, tj. Identyfikator obrazu Docker.

kushalbhattad
źródło
3

Najbardziej kompaktowa wersja polecenia usuwania wszystkich nieoznaczonych obrazów to:

docker rmi $(docker images | grep "^<none>" | awk '{print $"3"}')
czerwony
źródło
3

Aby usunąć część obrazu Docker, musisz wykonać następujące polecenie:

$ docker rmi <docker_image_id>

Aby usunąć wszystkie obrazy Dockera, możesz wykonać następujące polecenie:

$ docker rmi $(docker images -q)

Teraz, jeśli chcesz usunąć wszystkie obrazy Dockera (w tym obrazy, które są w użyciu), możesz dodać flagę -f, na przykład:

$ docker rmi -f $(docker images -q)
José David García Rodríguez
źródło
3

Posługiwać się

docker image prune -all

lub

docker image prune -a

Usuń wszystkie wiszące obrazy. Jeśli -ajest określony, spowoduje to również usunięcie wszystkich obrazów, do których nie odwołuje się żaden kontener.

Uwaga: przed usunięciem śliwek zostanie wyświetlony monit o potwierdzenie, ale nie zostanie wyświetlona lista potencjalnie usuniętych plików. Ponadto docker image lsnie obsługuje filtrowania negatywnego, dlatego trudno jest przewidzieć, które obrazy zostaną faktycznie usunięte.

Jak stwierdzono w dokumentacji Dockera dla śliwek .

Dylan
źródło
1

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 Dockera meltwater/docker-cleanup.

W ten sposób nie musisz czyścić go ręcznie.

Po prostu biegnij:

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

Będzie działał co 30 minut (lub jak długo ustawisz go za pomocą opcji DELAY_TIME = 1800) i usuniesz opuszczone pojemniki i obrazy.

Więcej informacji: https://github.com/meltwater/docker-cleanup/blob/master/README.md

Niewinny Anigbo
źródło