Błąd platformy Docker nie może usunąć kontenera platformy Docker, konflikt: nie można usunąć odwołania do repozytorium

165

Chcę usunąć kontener w Docker, ale gdy chcesz usunąć, pojawia się błąd

Mój następny krok przed usunięciem kontenera, zobacz listę istniejących kontenerów

sts@Yudi:~/docker$ sudo docker ps -as

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES                  SIZE
78479ffeba5c        ubuntu              "/bin/bash"         42 hours ago        Exited (0) 42 hours ago                       sharp_wescoff          81 B (virtual 187.7 MB)
0bd2b54678c7        training/webapp     "python app.py"     5 days ago          Exited (0) 5 days ago                         backstabbing_ritchie   0 B (virtual 323.7 MB)
0adbc74a3803        training/webapp     "python app.py"     5 days ago          Exited (143) 5 days ago                       drunk_feynman          0 B (virtual 323.7 MB)

jeden Chcę usunąć listę, a mianowicie „szkolenie / aplikacja internetowa”, ale wystąpił błąd

sts@Yudi:~/docker$ sudo docker rmi training/webapp
Error response from daemon: conflict: unable to remove repository reference "training/webapp" (must force) - container 0bd2b54678c7 is using its referenced image 54bb4e8718e8
Error: failed to remove images: [training/webapp]

Czy kontener działa w obrazach?

Proszę pomóż

Yuday
źródło
czasami mi się to zdarza, ale nie jestem w stanie zrozumieć, co powoduje to zjawisko (ponieważ nie zawsze mi się to przytrafia), a jeśli wymuszę usunięcie obrazu, usunie to również wiele innych rzeczy. Czy wiesz, co spowodowało błąd? czy jesteś w stanie to odtworzyć?
Charlie Parker
Doskonałe ostatnie podsumowanie Jak usunąć obrazy, kontenery i woluminy
platformy

Odpowiedzi:

124

Istnieje różnica między obrazami platformy Docker a kontenerami platformy Docker. Sprawdź to pytanie SO .

Krótko mówiąc, kontener to działająca instancja obrazu. dlatego nie można usunąć obrazu, jeśli istnieje uruchomiony kontener z tego obrazu. Musisz tylko najpierw usunąć kontener.

docker ps -a               # Lists containers (and tells you which images they are spun from)
docker images              # Lists images  
docker rm <container_id>   # Removes a container

docker rmi <image_id>      # Removes an image 
                           # Will fail if there is a running instance of that image i.e. container

docker rmi -f <image_id>   # Forces removal of image even if it is referenced in multiple repositories, 
                           # i.e. same image id given multiple names/tags 
                           # Will still fail if there is a docker container referencing image

Aktualizacja dla Dockera 1.13+ [od stycznia 2017 r.]

W Dockerze 1.13 przegrupowaliśmy każde polecenie tak, aby znajdowało się pod obiektem logicznym, z którym współdziała

Zasadniczo powyższe polecenia można również przepisać, jaśniej, jako:

docker container ls -a
docker image ls
docker container rm <container_id>
docker image rm <image_id>

Ponadto, jeśli chcesz usunąć WSZYSTKO, możesz użyć:

docker system prune -a

OSTRZEŻENIE! Spowoduje to usunięcie:

  • wszystkie zatrzymane kontenery
  • wszystkie sieci, które nie są używane przez co najmniej jeden kontener
  • wszystkie nieużywane obrazy
  • cała pamięć podręczna kompilacji
Ahmad Abdelghany
źródło
3
Skończyło się na tym, że musiałem użyć docker rmi -f iddo „wymuszenia” usunięcia.
WernerCD
@WernerCD -fpomaga, gdy chcesz usunąć obraz, do którego odwołuje się wiele repozytoriów, co jest kolejnym częstym powodem niepowodzenia usunięcia obrazu.
Ahmad Abdelghany
1
Warto zauważyć, że docker container lszawiera tylko listę działających kontenerów. To mi przeszkadzało, dopóki nie zdałem sobie sprawy, że dodanie -aflagi powoduje wyświetlenie ich wszystkich.
MFB
@MFB Słuszna uwaga. Dodano flagę do polecenia, aby zachować parzystość między dwoma zestawami poleceń. Dzięki!
Ahmad Abdelghany
nadal działa na OSX Docker Desktop v2.2.0.4 (silnik 19.03.8)
rrrrrraul
83

Najpierw usuń nazwy kontenerów

$ sudo docker rm backstabbing_ritchie

Wynik

$ sudo docker rm backstabbing_ritchie
  backstabbing_ritchie

usuń drugą część, która znajduje się na kontenerze do usunięcia

$ sudo docker rm drunk_feynman 
  drunk_feynman

Po drugie, wyjmij pojemnik

$ sudo docker rmi training/webapp

Wynik

$ sudo docker rmi training/webapp  
  Untagged: training/webapp:latest
  Deleted: 54bb4e8718e8600d78a5d7c62208c2f13c8caf0e4fe73d2bc0e474e93659c0b5
  Deleted: f74dd040041eb4c032d3025fe38ea85de8075992bdce6789b694a44b20feb8de
  Deleted: 7cbae69141977b99c44dc6957b032ad50c1379124d62b7d7d05ab7329b42348e
  Deleted: abb991a4ed5e4cde2d9964aec4cccbe0015ba9cc9838b696e7a32e1ddf4a49bd
  Deleted: 1952e3bf3d7e8e6a9b1e23bd4142e3c42ff7f4b7925122189704323593fd54ac
  Deleted: f95ebd363bf27a7546deced7a41a4099334e37a3d2901fa3817e62bb1ade183f
  Deleted: 20dd0c75901396d41a7b64d551ff04952084cc3947e66c67bae35759c80da338
  Deleted: 2505b734adda3720799dde5004302f5edb3f2a2ff71438f6488b530b728ba666
  Deleted: 2ee0b8f351f753f78f1178000ae37616eb5bf241d4ef041b612d58e1fd2aefdc
  Deleted: 2ce633e3e9c9bd9e8fe7ade5984d7656ec3fc3994f05a97d5490190ef95bce8d
  Deleted: 98b15185dba7f85308eb0e21196956bba653cf142b36dc08059b3468a01bf35d
  Deleted: 515565c29c940355ec886c992231c6019a6cffa17ff1d2abdfc844867c9080c5
  Deleted: 2880a3395eded9b748c94d27767e1e202f8d7cb06f1e40e18d1b1c77687aef77

Sprawdź kontynent

  $ sudo docker ps -as
  CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES                  SIZE
  78479ffeba5c        ubuntu              "/bin/bash"         43 hours ago        Exited (0) 43 hours ago                       sharp_wescoff          81 B (virtual 187.7 MB)
Yuday
źródło
6
Jeśli masz dużo starych kontenerów, możesz również rozważyć rm `docker ps -aq`czyszczenie przy użyciu dockera, zamiast usuwania ich pojedynczo. Więcej informacji tutaj
Philiiiiiipp
Dlaczego konieczne jest usunięcie nazwy przed usunięciem obrazu? Dlaczego próba usunięcia obrazu bez uprzedniego usunięcia nazwy miałaby w ogóle stanowić problem?
code_dredd
@code_dredd Nie ma czegoś takiego jak „usuwanie nazw”. Jest to kontener, który należy najpierw usunąć przed usunięciem obrazu. Więcej szczegółów na stackoverflow.com/a/40283776/1998422
Ahmad Abdelghany
37

Jeśli chcesz wyczyścić obrazy i kontenery dockera

UWAGA: to wszystko spłukuje

zatrzymać wszystkie pojemniki

docker stop $(docker ps -a -q)

usunąć wszystkie pojemniki

docker rm $(docker ps -a -q)

usuń wszystkie obrazy

docker rmi -f $(docker images -a -q)
quAnton
źródło
To się udało. Ponadto, jeśli zatrzymasz kontener, nadal będziesz go widzieć na liście. Dlatego musisz go usunąć za pomocą docker rm $(docker ps -a -q). Dzięki!
28

możesz użyć -fopcji wymuszenia usunięcia kontenerów.

sudo docker rmi -f training/webapp

Możesz zatrzymać używanie kontenerów sudo docker stop training/webappprzed usunięciem

Saril Sudhakaran
źródło
1
Wypróbowałem to, zatrzymując kontener $ sudo docker stop training / webapp Odpowiedź na błąd od demona: brak takiego identyfikatora: szkolenie / aplikacja internetowa Błąd: nie udało się zatrzymać kontenerów: [szkolenie / aplikacja internetowa]
Yuday
możesz spróbować zatrzymać się z dowodem tożsamości kontenera sudo docker stop 0bd2b54678c7
Saril Sudhakaran,
23

Jeśli masz uruchomione wielokrotne kontenery docker, użyj tego

$ docker rm $(docker ps -aq)

Spowoduje to usunięcie wszystkich bieżących dokerów wymienionych w poleceniu „ps -aq”.

Źródło: aaam na https://github.com/docker/docker/issues/12487

gael
źródło
To zadziałało dla mnie. Po uruchomieniu tego polecenia miałem uruchomić, docker image lsa następnie uzyskać docker image rm Xkażdy X z lswyjścia.
jftuga
5

Zauważyłem, że jest to pytanie sprzed 2 lat, ale nadal chcę podzielić się moim obejściem dla tego konkretnego pytania:

Po pierwsze, uruchom docker container ls -alistę wszystkich posiadanych kontenerów i wskaż, które chcesz usunąć.

Po drugie, usuń ten za pomocą polecenia docker container rm <CONTAINER ID>(jeśli kontener jest obecnie uruchomiony, należy go najpierw zatrzymać, uruchomić, docker container stop <CONTAINER ID>aby bezpiecznie zatrzymać określony kontener, jeśli nie zatrzyma go z jakiegokolwiek powodu, alternatywnie możesz uruchomić docker container kill <CONTAINER ID> to force shutdown of the specified container).

Po trzecie, usuń pojemnik, uruchamiając docker container rm <CONTAINER ID>.

Na koniec możesz uruchomić, docker image ls -aaby wyświetlić wszystkie obrazy i usunąć ten, który chcesz, uruchamiając docker image rm <hash>.

Użytkownik3301
źródło
2

Usuń obrazy dockera>

Lista wszystkich kontenerów

docker container ls

Lista wszystkich obrazów

docker image ls

Zatrzymaj kontener według identyfikatora kontenera

docker container stop <container_id>

Usuń kontener według identyfikatora kontenera

docker container rm <container_id>

Jeśli nie chcesz zatrzymać i usunąć, możesz wymusić usunięcie

docker container rm -f <container_id>

Usuń obraz

docker image rm <image_id>

Gotowe!

Anthony Piñero
źródło
2

lista wszystkich obrazów dockera:

docker images

lista wszystkich istniejących kontenerów Dockera:

docker ps -a

usuń wszystkie docelowe kontenery, które używają obrazu, który chcesz usunąć:

docker rm <container-id>

usuń docelowy obraz:

docker rmi <image-name:image-tag or image-id>
Mhd Medfa
źródło
0

Usuń tylko kontenery skojarzone z określonym obrazem

docker ps -a | grep training/webapp | cut -d ' ' -f 1 | xargs docker rm
  • ps -a: wyświetla wszystkie kontenery
  • grep training / webapp: odfiltrowuje wszystko, ale kontenery zaczynały się od obrazu szkolenia / aplikacji internetowej
  • cut -d '' -f 1: wyświetla tylko identyfikatory kontenerów (pierwsze pole, gdy jest oddzielone spacją)
  • xargs docker rm: wyślij wynik listy identyfikatorów kontenerów do polecenia docker rm, aby usunąć kontener
AndrewD
źródło