Docker-无法删除失效的容器


78

我无法删除失效的容器,重新启动Docker服务后,它将再次出现。

docker ps -a
CONTAINER ID         STATUS          
11667ef16239         Dead

然后

docker rm -f 11667ef16239

然后,当我运行docker ps -a时,没有显示docker容器。

docker ps -a
CONTAINER ID         STATUS

但是,当我重新启动docker服务时:

service docker restart

然后再次运行docker ps -a:

docker ps -a
CONTAINER ID         STATUS          
11667ef16239         Dead

3
嗨,这仍然是当前问题,但是当前接受的答案已不再有效,而且风险很大。有一个很重要的答案,这是一个很好的答案,所以,如果您接受的话,那将是公平的
Daniel F

umount回答是不可行的了,因为它不允许卸载如果资源正忙。同样,杀死负责任的pid也不起作用。
Nutle

Answers:


46

最有可能的是,当守护程序尝试清理容器时发生错误,并且他现在陷入了“僵尸”状态。

恐怕您这里唯一的选择是手动清理它:

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

哪里<storage_driver>是你的驱动程序的名称(aufsoverlaybtrfs,或devicemapper)。


是通过发出docker命令而不是诉诸sudo rm来实现的功能等同于此操作...对于像我这样在产品包装盒上没有sudo权限的人
Scott Stensland 18-10-10

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

您通常可以在那之后取出容器


感觉这是最好,最安全的一个!
丹尼尔·F

我刚刚重新启动系统,然后又重新登录了。
超级英雄

这对我有用,尽管我必须重新启动docker服务以使输出docker ps -a实际上为空。
丹尼尔·奎因

1
两年后,这个帖子仍然有用。仅仅花了两个小时试图找到一个解决方案,然后遇到了这个问题:github.com/moby/moby/issues/3786#issuecomment-33471966。要卸下所有devicemapper容器,请使用umount $(grep 'devicemapper' /proc/mounts | awk '{print$2}' | sort -r)
Alexander F.

42

您也可以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

4
docker system prune比预期做得更多,但解决了问题。如OP中所述,docker rm --force无效。
rdupz

1
正如@rdupz所暗示的那样,这docker system prune 很危险,请参阅此注释,以了解使用时如何删除甚至命名卷-a。它还会删除网络,这通常不是您想要的。最好在1.13docker image prune及更高版本中使用docker volume prune
RichVel

该命令给出语法错误。我认为您放错了力量-f参数
-VPaul

28

删除失效的容器(CentOS 7上的docker 17.06.1-ce)时出现以下错误:

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。检查哪些其他进程也在使用docker资源

$ 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与Docker容器共享同一安装名称空间从而防止其删除的讨论,此处。)

3.停止nginx,然后我可以成功删除容器。

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

1
谢谢您为nginx提供信息的先生,我遇到了同样的问题,这让我很生气,我的DNS进程(命名)也遇到了同样的问题,必须:systemctl restart named
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

尝试了以上所有方法(缺少重启/重启docker)。

所以这是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

这是令人讨厌的进程的PID,使其保持繁忙状态-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守护程序,从而解决了该问题!!!


你救了我的日子。我为问题苦苦挣扎。即使重新启动docker守护程序后,问题也没有解决。我相信这个答案应该被接受。谢谢。
坐在

6

尝试运行以下命令。它总是对我有用。

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

执行完上述命令后,重启docker by,

# service docker restart

6
grep 656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3 /proc/*/mountinfo

然后找到656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3and并杀死它


后面的数字/proc/是pid
Belter

6

我已经尝试了上面的建议,但是没有用。

然后

  1. 我尝试:docker system prune -a,第一次没有用
  2. 我重新启动系统
  3. 我再试一次docker system prune -a。这次可以了。它将发送警告消息,最后询问“您确定要继续吗?是/否?
  4. 验证 docker ps -a

重要提示-这是核选项,因为它会破坏所有容器和图像


这对我有用。谢谢!我还必须重新启动系统。
pandasCat


2

对于Windows:

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

然后重新启动Docker Desktop



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

0

在Centos7和Docker 1.8.2上运行,我无法使用Zgr3doo的解决方案通过devicemapper进行卸载(我认为得到的响应是未装载/找到该卷。)

我认为sk8terboi87 also的回答也发生了类似的事情:我相信消息是无法卸载这些卷,并且列出了为删除已删除的容器而试图卸载的特定卷。

对我有用的是首先停止docker,然后手动删除目录。通过上一个命令的错误输出,我能够确定它们是哪些,以删除所有失效的容器。

对于上述含糊的说明表示歉意。处理死容器后的几天,我就发现了这个问题。..但是,我今天注意到了类似的模式:

$ 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 ==发出,但是,容器ID与先前使用了我强行删除的卷的容器的ID匹配。删除此新容器没有困难:

$ sudo docker rm -v compassionate_ardinghelli
compassionate_ardinghelli

1
备选方案2:将其改编成自己的独立答案。这样做时可以参考其他答案-但要具体说明您正在谈论哪个答案,例如,以作者的名字命名。以“我还不能评论...”开头的内容可以保证将您的帖子删除。如果您有什么需要补充的答案-那就做吧!(到那里,再获得9个代表!)祝您好运。
Mogsdad '16

0

试试这个在centos上对我有用的方法1)docker container ls -a为您提供了您要摆脱的容器检查状态列表 在此处输入图片说明 2)docker container rm -f 97af2da41b2b不是一个大的风扇力标志,但是会做检查工作它的工作只是再次触发该命令或列出它。 在此处输入图片说明 3)继续直到我们清除所有死容器 在此处输入图片说明


0
  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

摆脱死掉的容器进程的最好方法是重新启动docker服务。我无法删除容器,因为它处于重新启动状态,我只是重新启动了docker服务,它对我有用。


0

就我而言,我必须用

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

而且有效。也许这就是您在Docker版本〜19中解决它的方法。我的搬运工版本是19.03.12

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.