【问题标题】:Docker - Cannot remove dead containerDocker - 无法删除死容器
【发布时间】:2015-06-12 01:43:34
【问题描述】:

无法移除死容器,重启 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

【问题讨论】:

  • 嗨,这仍然是一个当前问题,但当前接受的答案不再有效,而且风险很大。有 umount 答案,这是一个很好的答案,所以如果可能的话,如果你接受那个答案,那将是公平的
  • umount 答案不再可行,因为如果资源繁忙,它不允许卸载。同样,杀死负责的 pid 也不起作用。

标签: docker


【解决方案1】:

很可能,当守护进程试图清理容器时发生了错误,他现在陷入了这种“僵尸”状态。

恐怕你唯一的选择是手动清理它:

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

&lt;storage_driver&gt; 是您的驱动程序的名称(aufsoverlaybtrfsdevicemapper)。

【讨论】:

  • 对于像我这样在我们的产品盒上没有 sudo 权限的人来说,通过发出 docker 命令而不是诉诸 sudo rm 来实现此操作的功能等效
  • 您可能还想尝试相反的方法:zfs create 那个卷,这样 Docker 就可以很高兴地删除它。
  • 删除文件后可能还需要重新启动 docker 服务。
【解决方案2】:

您还可以使用此命令删除 dead 容器

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

但是,我真的不确定为什么以及如何创建 dead 容器。每当我收到 dead 容器时,此错误似乎与 https://github.com/typesafehub/mesos-spark-integration-tests/issues/34 相关

[更新] 通过 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 没有它们也可以工作。它已经死了,所以没有依赖进程。
  • docker system prune 做得比预期的要多,但解决了问题。正如 OP 中所述,docker rm --force 不起作用。
  • 正如@rdupz 所暗示的,docker system prune 很危险,请参阅this comment,了解它如何在使用-a 时删除甚至命名的卷。它还删除了通常不是您想要的网络。最好在 1.13+ 中使用 docker image prunedocker volume prune
  • 此命令给出语法错误。我认为你放错了力量-fparam
【解决方案3】:

实际上,为了摆脱那些死容器,你可以尝试卸载那些被阻塞的文件系统来释放它们

所以如果你收到这样的消息

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 服务才能使 docker ps -a 的输出实际上为空。
  • 两年后,这篇文章仍然有意义。花了两个小时试图找到一个解决方案,然后遇到了这个:github.com/moby/moby/issues/3786#issuecomment-33471966。要卸载所有 devicemapper 容器,请使用 umount $(grep 'devicemapper' /proc/mounts | awk '{print$2}' | sort -r)
【解决方案4】:

删除死容器时出现以下错误(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!!!

所以,带有 pid 12345 的nginx 似乎也在使用/var/lib/docker/overlay/...,这就是为什么我们无法删除相关容器并得到device or resource busy 错误的原因。 (参见here 讨论nginx 如何与docker 容器共享相同的挂载命名空间,从而防止其被删除。)

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

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

【讨论】:

  • 谢谢你的nginx信息,我有同样的问题,它让我生气了很多次,我也有同样的问题与DNS进程(命名),不得不:systemctl重新启动命名
【解决方案5】:

我遇到了同样的问题,两个答案都没有帮助。

对我有帮助的只是创建缺少的目录并将它们删除:

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

【讨论】:

    【解决方案6】:

    强行移除容器对我有用。

    docker rm -f &lt;id_of_the_dead_container&gt;

    注意事项

    请注意,此命令可能会引发此错误 Error response from daemon: Driver devicemapper failed to remove root filesystem &lt;id_of_the_dead_container&gt;: Device is Busy

    尽管有此消息,您的死容器设备映射器的安装仍应删除。也就是说,您将不再访问此路径:

    /var/lib/docker/devicemapper/mnt/&lt;id_of_the_dead_container&gt;

    【讨论】:

      【解决方案7】:

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

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

      这是保持它忙碌的有问题进程的 PID - 20416(/proc/ 之后的项目

      所以我做了一个 ps -p 并让我惊讶地发现:

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

      真正的 WTF 时刻。所以我用谷歌解决了问题并发现了这个: 然后找到了这个https://github.com/docker/for-linux/issues/124

      原来我必须重新启动 ntp 守护程序,这解决了问题!!!

      【讨论】:

      • 你拯救了我的一天。我一直在努力解决问题。即使重新启动 docker 守护程序后,问题也没有解决。我相信这个答案应该被接受。谢谢。
      【解决方案8】:

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

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

      执行完以上命令后,重启docker,

      # service docker restart
      

      【讨论】:

        【解决方案9】:
        grep 656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3 /proc/*/mountinfo
        

        然后找到656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3and的pid并杀死它

        【讨论】:

        • /proc/ 后面的数字是 pid
        【解决方案10】:

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

        然后

        1. 我试试:docker system prune -a,第一次没成功
        2. 我重新启动系统
        3. 我再试一次docker system prune -a。这次它起作用了。它将发送一条警告消息,最后询问“您确定要继续吗?y/n?. Ans:y . 它会一段时间,最后死容器消失了。
        4. 验证docker ps -a

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

        【讨论】:

        • 这对我有用。谢谢!我还必须重新启动系统。
        【解决方案11】:
        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 错误:没有这样的容器: c81751444时尚
        • 我的系统出了点问题。你在两天内第二次救了我。哈哈
        【解决方案12】:

        对于 Windows:

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

        然后重启Docker Desktop

        【讨论】:

          【解决方案13】:

          尝试杀死它然后删除 >:) 即
          docker kill $(docker ps -q)

          【讨论】:

            【解决方案14】:

            试试,对我有用:

            $ 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
            

            【讨论】:

              【解决方案15】:

              试试这个它对我有用:

              docker rm -f <container_name>
              
              eg. docker rm -f 11667ef16239
              

              【讨论】:

                【解决方案16】:

                这里有很多答案,但没有一个涉及对我有用的(快速)解决方案。

                我使用的是 Docker 版本 1.12.3,构建 6b644ec。

                我只是运行docker rmi &lt;image-name&gt; 来获取死容器来自的图像。 docker ps -a 然后显示死容器完全丢失。

                然后,当然,我只是重新拉出图像并再次运行容器。

                我不知道它是如何发现自己处于这种状态的,但它是……

                【讨论】:

                  【解决方案17】:

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

                  我认为 sk8terboi87 ツ 的回答也发生了类似的事情:我相信消息是无法卸载卷,它列出了它试图卸载以删除死者的特定卷容器。

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

                  对于上述含糊的描述,我们深表歉意。我在处理死容器几天后发现了这个 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,但是,容器 ID 与之前使用我强制删除的卷的容器的 ID 匹配。删除这个新容器没有任何困难:

                  $ sudo docker rm -v compassionate_ardinghelli
                  compassionate_ardinghelli
                  

                  【讨论】:

                  • 备选方案 2:将其改造成自己的独立答案。这样做时可以参考其他答案 - 但要具体说明您正在谈论的答案,例如按作者姓名。以“我还不能发表评论……”开始,几乎可以保证您的帖子被删除。如果您有一些有用的东西可以作为答案添加 - 那就去做吧! (然后走出去,再获得 9 次代表!)祝你好运。
                  【解决方案18】:

                  试试这个它在centos上对我有用 1) 码头集装箱 ls -a 为您提供您想要摆脱的容器检查状态列表 2) 码头集装箱 rm -f 97af2da41b2b 不是一个很大的粉丝力量旗帜,但确实有效 要检查它是否有效,只需再次触发命令或列出它。 3)继续直到我们清除所有死容器

                  【讨论】:

                    【解决方案19】:

                    摆脱死容器进程的最佳方法是重新启动 docker 服务。 我无法删除容器,因为它卡在重新启动状态,我刚刚重新启动了 docker 服务,它对我有用。

                    【讨论】:

                      【解决方案20】:

                      在我的情况下,我不得不删除它

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

                      它奏效了。也许这就是你在 docker 版本 ~19 中解决它的方法。我的 docker 版本是19.03.12

                      【讨论】:

                        【解决方案21】:

                        我在 Windows 右下角重启了 Docker 代理,docker iCon,重启 Docker。然后我运行 docker ps -a 并看到容器仍然坐在那里。 然后我运行了 docker rm -f container id 这对我有用。

                        【讨论】:

                          【解决方案22】:

                          如果您是 Mac/Windows 用户并拥有 Docker Desktop,您只需重新启动 Docker Desktop,然后在 UI 中即可轻松移除容器。

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2021-10-23
                            • 2016-02-27
                            • 1970-01-01
                            • 2022-08-03
                            • 2018-10-09
                            • 2014-11-21
                            • 1970-01-01
                            • 2021-10-10
                            相关资源
                            最近更新 更多