Помилка 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.