Помилка Docker не може видалити контейнер докера, конфлікт: неможливо видалити посилання на сховище


165

Я хочу видалити контейнер у Docker, але при видаленні виникає помилка

Наступний мій крок перед видаленням контейнера див. У списку існуючого контейнера

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)

я хочу видалити список, а саме "тренінг / webapp", але сталася помилка

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]

Чи працює контейнер у зображеннях?

Будь ласка, допоможіть


це трапляється зі мною іноді, але я не в змозі з’ясувати схему того, що спричиняє це (оскільки це не завжди трапляється зі мною), плюс якщо я змушу видалити зображення, воно також видаляє купу інших речей. Чи знаєте ви, що спричинило помилку для вас? ти вмієш її відтворити?
— Чарлі Паркер

Відмінне нещодавнє резюме Як видалити зображення, контейнери та обсяги Docker з Melissa Anderson Dec 2017, з прикладами фільтрів, візерунками тощо
— Webel IT Australia - upvoter

Відповіді:


124

Існує різниця між зображеннями докера та контейнерами докера. Перевірте це питання .

Коротше кажучи, контейнер - це запущений екземпляр зображення. тому ви не можете видалити зображення, якщо з цього зображення є запущений контейнер. Вам потрібно спочатку видалити контейнер.

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

Оновлення для Docker 1.13+ [З січня 2017]

У Docker 1.13 ми перегрупували кожну команду, щоб сидіти під логічним об'єктом, з яким вона взаємодіє

В основному, вищезазначені команди також можуть бути переписані, більш чітко, як:

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

Крім того, якщо ви хочете видалити ВСЕ, ви можете скористатися:

docker system prune -a

УВАГА! Це видалить:

  • всі зупинені контейнери
  • всі мережі, що не використовуються щонайменше одним контейнером
  • всі невикористані зображення
  • всі кеш-пам'ять

3
Мені в кінцевому підсумку довелося використовувати, docker rmi -f idщоб "примусити" видалення.
— WernerCD

@WernerCD -fдопомагає, коли ви хочете видалити зображення, на яке посилається в декількох сховищах, що є ще однією поширеною причиною невдалого видалення зображення.
— Ахмад Абдельгані

1
Варто зазначити, що docker container lsперелічені лише запущені контейнери. Це зіпсувалося зі мною, поки я не зрозумів, що додаючи -aпрапор, перелічено їх усі.
— MFB

@MFB Добре. Додано прапор до команди, щоб підтримувати паритет між двома наборами команд. Дякую!
— Ахмад Абдельгані

досі працює на OSX Docker Desktop v2.2.0.4 (двигун 19.03.8)
— rrrrrraul

83

Спочатку видаліть назви контейнерів

$ sudo docker rm backstabbing_ritchie

Результат

$ sudo docker rm backstabbing_ritchie
  backstabbing_ritchie

видалити другу частину, яка вказана на контейнері, який потрібно видалити

$ sudo docker rm drunk_feynman 
  drunk_feynman

По-друге, вийміть контейнер

$ sudo docker rmi training/webapp

Результат

$ 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

Перевірте континент

  $ 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)

6
Якщо у вас багато старих контейнерів, ви можете також розглянути докер rm `docker ps -aq`для очищення, а не видаляти їх по черзі. Більше інформації тут
— Philiiiiiipp

Чому перед видаленням зображення потрібно видалити ім’я? Чому спроба видалити зображення без першого видалення імені взагалі є проблемою?
— code_dredd

@code_dredd Не існує такого поняття, як "видалення імен". Саме контейнер повинен бути видалений спочатку перед видаленням зображення. Детальніше на stackoverflow.com/a/40283776/1998422
— Ahmad Abdelghany

37

Якщо ви хочете очистити докерські зображення та контейнери

ОБЕРЕЖНО: це все змиє

зупинити всі контейнери

docker stop $(docker ps -a -q)

видаліть усі контейнери

docker rm $(docker ps -a -q)

видалити всі зображення

docker rmi -f $(docker images -a -q)

Це спрацювало. Крім того, якщо ви зупините контейнер, ви все одно побачите його у списку. Тому його потрібно видалити за допомогою docker rm $(docker ps -a -q). Дякую!

28

ви можете використовувати -fопцію, щоб примусити видалити контейнери.

sudo docker rmi -f training/webapp

Ви можете зупинити використання контейнерів sudo docker stop training/webappперед видаленням


1
Я спробував це, зупинивши контейнер $ sudo docker зупинивши навчання / webapp Повідомлення про помилку від демона: немає такого id:
— Training

ви можете спробувати зупинитись із ідентифікатором контейнера sudo docker stop 0bd2b54678c7
— Саріл Судхакаран,

23

Якщо у вас запущено кілька докерних контейнерів, використовуйте це

$ docker rm $(docker ps -aq)

Він видалить усі поточні докери, перелічені в команді "ps -aq".

Джерело: aaam на https://github.com/docker/docker/isissue/12487


Це працювало для мене. Після того, як я запустив цю команду, я повинен був запустити docker image lsі тоді, docker image rm Xде кожен X був отриманий з lsрезультату.
— jftuga

5

Зауважив, що це питання на два роки, але все-таки хочу поділитися моїм вирішенням цього конкретного питання:

По-перше, запустіть docker container ls -aсписок усіх контейнерів, які ви маєте, і точно визначте, яке ви хочете видалити.

По-друге, видаліть команду docker container rm <CONTAINER ID>(Якщо контейнер зараз працює, вам слід зупинити його спочатку, запустіть, docker container stop <CONTAINER ID>щоб витончено зупинити вказаний контейнер, якщо він не зупиняє його з будь-якої причини, або ви можете запустити docker container kill <CONTAINER ID> to force shutdown of the specified container).

По-третє, видаліть контейнер запуском docker container rm <CONTAINER ID>.

Нарешті, ви можете запустити, docker image ls -aщоб переглянути всі зображення та видалити потрібне, запустівши docker image rm <hash>.


2

Видаліть зображення докера>

Список усіх контейнерів

docker container ls

Список усіх зображень

docker image ls

Зупинення контейнера за ідентифікатором контейнера

docker container stop <container_id>

Видаліть контейнер за ідентифікатором контейнера

docker container rm <container_id>

Якщо ви не хочете зупинити та видалити, можете примусити видалити

docker container rm -f <container_id>

Видалити зображення

docker image rm <image_id>

Готово!


2

перерахуйте всі ваші зображення докера:

docker images

перерахуйте всі існуючі контейнери докера:

docker ps -a

видаліть усі націлені контейнери, в яких використовується зображення, яке ви хочете видалити:

docker rm <container-id>

видалити цільове зображення:

docker rmi <image-name:image-tag or image-id>

0

Видаліть лише контейнери, пов’язані з певним зображенням

docker ps -a | grep training/webapp | cut -d ' ' -f 1 | xargs docker rm
  • ps -a: список усіх контейнерів
  • grep training / webapp: відфільтруйте все, крім контейнерів, що починаються із зображення навчальних / webapp
  • cut -d '' -f 1: список лише ідентифікаторів контейнерів (перше поле, якщо розміщено пробіл)
  • xargs docker rm: надішліть висновок ідентифікатора контейнера команді docker rm для видалення контейнера
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.