Docker - Не вдається видалити мертвий контейнер


81

Я не можу видалити мертвий контейнер, він з’являється знову після того, як я перезапустив службу Docker.

docker ps -a
CONTAINER ID         STATUS          
11667ef16239         Dead

Тоді

docker rm -f 11667ef16239

Потім, коли я запустив докер ps -a, контейнерів докера не відображалося.

docker ps -a
CONTAINER ID         STATUS

Однак, коли я перезапускаю службу докера:

service docker restart

І знову запустіть докер ps -a:

docker ps -a
CONTAINER ID         STATUS          
11667ef16239         Dead

3
Привіт, це все ще актуальна проблема, але прийнята на даний момент відповідь вже недійсна і досить ризикована. Існує суттєва відповідь, яка є доброю, тому було б справедливо, якщо ви погодитесь з нею, якщо це можливо
— Даніель Ф

umountВідповідь не життєздатний більше, так як вона не дозволяє размонтированием , якщо ресурс зайнятий. І так само, вбивство відповідального піда теж не працює.
— Натл

Відповіді:


48

Швидше за все, сталася помилка, коли демон намагався очистити контейнер, і він зараз застряг у цьому "зомбі" стані.

Боюся, єдиним вашим варіантом тут є очищення вручну:

$ sudo rm -rf /var/lib/docker/<storage_driver>/11667ef16239.../

Де <storage_driver>це ім'я вашого драйвера ( aufs, overlay, btrfsабо devicemapper).


є функціональним еквівалентом цієї дії, можливим шляхом видачі команди докера замість того, щоб вдаватися до sudo rm ... для таких, як я, хто не має повноважень sudo на нашій коробці виробів
— Скотт Стенсленд,

45

Насправді в наші дні все трохи змінилося, щоб позбутися цих мертвих контейнерів, ви можете спробувати демонтувати заблоковані файлові системи, щоб звільнити їх

Тож якщо ви отримаєте таке повідомлення

Error response from daemon: Cannot destroy container elated_wozniak: Driver devicemapper failed to remove root filesystem 656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3: Device is Busy

просто запустіть це

umount /var/lib/docker/devicemapper/mnt/656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3

і після цього ви можете нормально вийняти контейнер


Цей почувається найкращим, найбезпечнішим!
— Даніель Ф

Я просто перезавантажив систему і, коли знову ввійшов .. контейнери, куди зникли.
— супергерой

Це спрацювало для мене, хоча мені довелося перезапустити службу докера, щоб результат docker ps -aфактично був порожнім.
— Даніель Квінн

1
Через два роки цей пост все ще актуальний. Просто витратив дві години, намагаючись знайти рішення, а потім натрапив на це: github.com/moby/moby/issues/3786#issuecomment-33471966 . Для демонтажу всіх контейнерів Devicemapper використовуйтеumount $(grep 'devicemapper' /proc/mounts | awk '{print$2}' | sort -r)
— AlexanderF

43

Ви також можете видалити deadконтейнери за допомогою цієї команди

docker rm $(docker ps --all -q -f status=dead)

Але, я справді не впевнений, чому і як deadстворюються контейнери. Ця помилка, здається, пов’язана https://github.com/typesafehub/mesos-spark-integration-tests/issues/34 кожного разу, коли я отримую deadконтейнери

[Оновлення] За допомогою оновлення Docker 1.13 ми можемо легко видалити обидва небажані контейнери, звисаючи зображення

$ docker system df #will show used space, similar to the unix tool df
$ docker system prune # will remove all unused data.

@Akvel Працює без них. Це вже мертве, тому ніяких залежних процесів.
— sk8terboi87,

5
docker system pruneзробив більше, ніж очікувалось, але вирішив проблему. Як зазначено в ОП, docker rm --forceне працює.
— rdupz

1
Як натякає @rdupz, docker system prune небезпечно , див. Цей коментар про те, як він видаляє навіть названі томи, коли з -a. Він також видаляє мережі, що зазвичай не є тим, що ви хочете. Краще використовувати docker image pruneі docker volume pruneв версії 1.13+.
— RichVel

Ця команда видає синтаксичну помилку. Я думаю , що ви недоречні силові -fпараметри
— VPaul

28

У мене виникла така помилка під час видалення мертвого контейнера (докер 17.06.1-ce на CentOS 7):

Error response from daemon: driver "overlay" failed to remove root filesystem for <some-id>: 
remove /var/lib/docker/overlay/<some-id>/merged: device or resource busy

Ось як я це виправив:

1. Перевірте, які інші процеси також використовують ресурси докера

$ grep docker /proc/*/mountinfo

який виводить щось подібне, де число після /proc/- це pid:

/proc/10001/mountinfo:179...
/proc/10002/mountinfo:149...
/proc/12345/mountinfo:159 149 0:36 / /var/lib/docker/overlay/...

2. Перевірте назву процесу вищезазначеного pid

$ ps -p 10001 -o comm=
dockerd
$ ps -p 10002 -o comm=
docker-containe
$ ps -p 12345 -o comm=
nginx   <<<-- This is suspicious!!!

Отже, nginxз pid 12345, схоже, також використовується /var/lib/docker/overlay/..., саме тому ми не можемо видалити відповідний контейнер і отримати device or resource busyпомилку. (Див. Тут обговорення того, як nginxспільний простір імен монтування з контейнерами докерів запобігає його видаленню.)

3. Зупиніться, nginxі тоді я зможу успішно вийняти контейнер.

$ sudo service nginx stop
$ docker rm <container-id>

1
спасибі сер за інформацію Nginx, у мене була та ж проблема, що розлючений мене так багато разів, я була така ж проблема з DNS - процесу ( по імені), був: systemctl рестарт імені
— user1928596

13

Я отримав одне і те ж питання, і обидві відповіді не допомогли.

Мені допомогло просто створення каталогів, яких не вистачає, і їх видалення:

mkdir /var/lib/docker/devicemapper/mnt/656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3
mkdir /var/lib/docker/devicemapper/mnt/656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3-init
docker rm 656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3

11

Зняття контейнера силою працювало у мене.

docker rm -f <id_of_the_dead_container>

Примітки :

Майте на увазі, що ця команда може спричинити цю помилку Error response from daemon: Driver devicemapper failed to remove root filesystem <id_of_the_dead_container>: Device is Busy

Монтаж засобу відображення пристроїв мертвих контейнерів слід видалити, незважаючи на це повідомлення. Тобто ви більше не будете отримувати доступ до цього шляху:

/var/lib/docker/devicemapper/mnt/<id_of_the_dead_container>


8

Спробував усе вищезазначене (окрім перезавантаження / перезапуску докера).

Отже, ось помилка om docker rm:

$ docker rm 08d51aad0e74
Error response from daemon: driver "devicemapper" failed to remove root filesystem for 08d51aad0e74060f54bba36268386fe991eff74570e7ee29b7c4d74047d809aa: remove /var/lib/docker/devicemapper/mnt/670cdbd30a3627ae4801044d32a423284b540c5057002dd010186c69b6cc7eea: device or resource busy

Потім я зробив наступне:

$  grep docker /proc/*/mountinfo | grep 958722d105f8586978361409c9d70aff17c0af3a1970cb3c2fb7908fe5a310ac
/proc/20416/mountinfo:629 574 253:15 / /var/lib/docker/devicemapper/mnt/958722d105f8586978361409c9d70aff17c0af3a1970cb3c2fb7908fe5a310ac rw,relatime shared:288 - xfs /dev/mapper/docker-253:5-786536-958722d105f8586978361409c9d70aff17c0af3a1970cb3c2fb7908fe5a310ac rw,nouuid,attr2,inode64,logbsize=64k,sunit=128,swidth=128,noquota

Це має бути ПІД процесу порушення, що робить його зайнятим - 20416 (пункт після / proc /

Тож я зробив ps -p і на мій подив знайшов:

[devops@dp01app5030 SeGrid]$ ps -p 20416
  PID TTY          TIME CMD
20416 ?        00:00:19 ntpd

Справжній момент WTF. Тож я поєднав проблему, вирішену з Google, і виявив: Потім знайшов це https://github.com/docker/for-linux/issues/124

Виявляється, мені довелося перезапустити демон ntp, і це вирішило проблему !!!


Ти врятував мій день. Я боровся з проблемою. Навіть після перезапуску демона докера проблема не була вирішена. Я вважаю, що цю відповідь слід прийняти. Дякую.
— сів

6

Спробуйте виконати наступні команди. У мене це завжди працює.

# docker volume rm $(docker volume ls -qf dangling=true)
# docker rm $(docker ps -q -f 'status=exited')

Після виконання вищевказаних команд перезапустіть докер,

# service docker restart

6
grep 656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3 /proc/*/mountinfo

потім знайдіть pid 656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3andі вбийте його


де число після /proc/- pid
— Белтер

6

Я спробував наведені вище пропозиції, але не спрацював.

Тоді

  1. Я намагаюся:, docker system prune -aце не спрацювало з першого разу
  2. Я перезавантажую систему
  3. Спробую ще раз docker system prune -a. Цього разу це працює. Він надішле попереджувальне повідомлення і в кінці запитає: "Ви впевнені, що хочете продовжити? Y / n?" Відповідь: y. Мине час, і в кінці мертві контейнери зникнуть.
  4. Перевірте за допомогою docker ps -a

ВАЖЛИВО - це ядерний варіант, оскільки він знищує всі контейнери + зображення


Це спрацювало для мене. Дякую! Мені також довелося перезавантажити систему.
— pandasCat


2

для Windows:

del D:\ProgramData\docker\containers\{CONTAINER ID}
del D:\ProgramData\docker\windowsfilter\{CONTAINER ID}

Потім перезапустіть робочий стіл Docker



1

Тут є багато відповідей, але жоден з них не передбачав (швидкого) рішення, яке працювало для мене.

Я використовую Docker версії 1.12.3, збірка 6b644ec.

Я просто побіг docker rmi <image-name>за зображенням, звідки прийшов мертвий контейнер. docker ps -aПотім А показав, що мертвий контейнер повністю зник.

Потім, звичайно, я просто витягнув зображення і знову запустив контейнер.

Я не уявляю, як воно опинилося в такому стані, але так воно і є ...


1

Спробуйте, у мене це вийшло:

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
4f13b53be9dd        5b0bbf1173ea        "/opt/app/netjet..."   5 months ago        Dead                                    appname_chess

$ docker rm $(docker ps --all -q -f status=dead)
Error response from daemon: driver "devicemapper" failed to remove root filesystem for 4f13b53be9ddef3e9ba281546aef1c544805282971f324291a1dc91b50eeb440: failed to remove device 487b4b73c58d19ef79201cf6d5fcd6b7316e612e99c14505a6bf24399cad9795-init: devicemapper: Error running DeleteDevice dm_task_run failed

su
cd /var/lib/docker/containers
[root@localhost containers]#  ls -l
total 0
drwx------. 1 root root 312 Nov 17 08:58 4f13b53be9ddef3e9ba281546aef1c544805282971f324291a1dc91b50eeb440
[root@localhost containers]# rm -rf 4f13b53be9ddef3e9ba281546aef1c544805282971f324291a1dc91b50eeb440
systemctl restart docker

1
  1. Для видалення всього мертвого контейнера docker rm -f $(docker ps --all -q -f status=dead)

  2. Для видалення всього закритого контейнера docker rm -f $(docker ps --all -q -f status=exited)

Як у мене -fце необхідно


Помилка: Немає такого контейнера: 2787a08aaf3c Не працює, відображається: Помилка: Немає такого контейнера: 2f13ced716af Помилка: Немає такого контейнера: 48d43ea0e93f Помилка: Немає такого контейнера: ab7720dd4392 Помилка: Немає такого контейнера: c81751444fad
— juliangonzalez

0

Запустивши Centos7 & Docker 1.8.2, я не зміг скористатися рішенням Zgr3doo для встановлення за допомогою devicemapper (я думаю, що отриманою відповіддю було те, що том не змонтований / знайдений.)

Я думаю, що у мене також сталося подібне з відповіддю sk8terboi87: я вважаю, що повідомлення було про те, що томи неможливо демонтувати, і в ньому перелічені конкретні томи, які він намагався зібрати, щоб видалити мертві контейнери.

У мене спрацювало те, що спочатку зупинив докер, а потім видалив каталоги вручну. Я зміг визначити, якими вони були, за результатом помилки попередньої команди, щоб видалити всі мертві контейнери.

Вибачення за нечіткі описи вище. Я знайшов це SO питання через кілька днів після того, як обробив мертві контейнери. .. Однак сьогодні я помітив подібну закономірність:

$ sudo docker stop fervent_fermi; sudo docker rm fervent_fermi fervent_fermi
Error response from daemon: Cannot destroy container fervent_fermi: Driver devicemapper failed to remove root filesystem a11bae452da3dd776354aae311da5be5ff70ac9ebf33d33b66a24c62c3ec7f35: Device is Busy
Error: failed to remove containers: [fervent_fermi]

$ sudo systemctl docker stop
$ sudo rm -rf /var/lib/docker/devicemapper/mnt/a11bae452da3dd776354aae311da5be5ff70ac9ebf33d33b66a24c62c3ec7f35
$

Я помітив, що, використовуючи такий підхід, Docker відтворив зображення з різними іменами:

a11bae452da3     trend_av_docker   "bash"   2 weeks ago    Dead    compassionate_ardinghelli

Можливо, це пов’язано з тим, що контейнеру видано restart = always, однак ідентифікатор контейнера відповідає ідентифікатору контейнера, який раніше використовував том, який я примусово видалив. Не було труднощів при видаленні цього нового контейнера:

$ sudo docker rm -v compassionate_ardinghelli
compassionate_ardinghelli

1
Альтернатива 2: переробіть це на свою власну, самостійну відповідь. При цьому можна посилатися на інші відповіді, але будьте конкретні, про яку відповідь ви говорите, наприклад, за іменем автора. Починаючи з "Я ще не можу коментувати ..." майже гарантовано видалить вашу публікацію. Якщо у вас є щось корисне, щоб додати як відповідь - просто зробіть це! (І виходьте туди і отримайте ще 9 представників!) Удачі.
— Могсдад,

0

Спробуйте це, у мене це вийшло на centos 1) docker container ls -a дає вам список перевірки стану контейнерів, від якого ви хочете позбутися введіть тут опис зображення 2) docker container rm -f 97af2da41b2b не великий прапор вентилятора, але виконує роботу з перевірки це спрацювало, просто запустіть команду ще раз або перелічіть її. введіть тут опис зображення 3) продовжуйте, поки ми не очистимо всі мертві контейнери введіть тут опис зображення


0

Найкращий спосіб позбутися мертвих процесів контейнера - перезапустити службу докера. Мені не вдалося видалити контейнер, оскільки він застряг у стані перезапуску, я просто перезапустив службу докера, і вона у мене спрацювала.


0

У моєму випадку мені довелося видалити його за допомогою

rm -r /var/lib/docker/containers/<container-id>/

і це спрацювало. Можливо, саме так ви вирішуєте це у версії docker ~ 19. Моєю версією докера було 19.03.12,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.