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.