Docker - 无法移除死容器

Tuo*_* Le 73 docker

我无法删除死容器,它在重新启动Docker服务后再次出现.

docker ps -a
CONTAINER ID         STATUS          
11667ef16239         Dead
Run Code Online (Sandbox Code Playgroud)

然后

docker rm -f 11667ef16239
Run Code Online (Sandbox Code Playgroud)

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

docker ps -a
CONTAINER ID         STATUS
Run Code Online (Sandbox Code Playgroud)

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

service docker restart
Run Code Online (Sandbox Code Playgroud)

并再次运行docker ps -a:

docker ps -a
CONTAINER ID         STATUS          
11667ef16239         Dead
Run Code Online (Sandbox Code Playgroud)

Zgr*_*doo 44

实际上这些日子发生了轻微变化,以便摆脱那些可能会尝试卸载那些被阻止的文件系统以释放它们的死容器

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

Error response from daemon: Cannot destroy container elated_wozniak: Driver devicemapper failed to remove root filesystem 656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3: Device is Busy
Run Code Online (Sandbox Code Playgroud)

跑吧

umount /var/lib/docker/devicemapper/mnt/656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3
Run Code Online (Sandbox Code Playgroud)

你可以在那之后正常删除容器


ice*_*ime 40

最有可能的是,当守护进程试图清理容器时发生错误,他现在陷入了这种"僵尸"状态.

我担心你唯一的选择是手动清理它:

$ sudo rm -rf /var/lib/docker/<storage_driver>/11667ef16239.../
Run Code Online (Sandbox Code Playgroud)

哪里<storage_driver>是你的驱动程序的名称(aufs,overlay,btrfs,或devicemapper).


sk8*_* ツ 38

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

docker rm $(docker ps --all -q -f status=dead)
Run Code Online (Sandbox Code Playgroud)

但是,我真的不确定为什么以及如何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.
Run Code Online (Sandbox Code Playgroud)

  • 您可能需要添加--force param才能正常工作 (3认同)
  • `docker system prune`比预期更多,但解决了这个问题.正如OP中所述,`docker rm --force`不起作用. (3认同)
  • 正如@rdupz所暗示的,“docker系统修剪”**是危险的**,请参阅[此评论](/sf/ask/2290617801/ images#comment77698372_32723127) 关于它如何在使用“-a”时删除甚至命名的卷。它还会删除网络,这通常不是您想要的。在 1.13+ 中最好使用 `docker image prune` 和 `docker volume prune`。 (2认同)

Ida*_*Ida 23

删除死容器(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
Run Code Online (Sandbox Code Playgroud)

以下是我修复它的方法:

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/...
Run Code Online (Sandbox Code Playgroud)

2.检查上述pid的进程名称

$ ps -p 10001 -o comm=
dockerd
$ ps -p 10002 -o comm=
docker-containe
$ ps -p 12345 -o comm=
nginx   <<<-- This is suspicious!!!
Run Code Online (Sandbox Code Playgroud)

因此,nginx使用pid 12345似乎也在使用/var/lib/docker/overlay/...,这就是为什么我们无法删除相关容器并获取device or resource busy错误.(有关如何使用docker容器共享相同的mount命名空间从而阻止其删除的讨论,请参见此处nginx.)

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

$ sudo service nginx stop
$ docker rm <container-id>
Run Code Online (Sandbox Code Playgroud)


Wou*_*ter 12

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

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

mkdir /var/lib/docker/devicemapper/mnt/656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3
mkdir /var/lib/docker/devicemapper/mnt/656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3-init
docker rm 656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3
Run Code Online (Sandbox Code Playgroud)


Luk*_*ski 10

强行拆除容器为我工作.

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>


Pra*_*kar 10

  1. 用于删除所有死容器 docker rm -f $(docker ps --all -q -f status=dead)

  2. 用于删除所有退出的容器docker rm -f $(docker ps --all -q -f status=exited)

因为我有-f必要


MrS*_*eve 8

尝试了以上所有方法(没有重新启动/重新启动 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
Run Code Online (Sandbox Code Playgroud)

然后我做了以下事情:

$  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
Run Code Online (Sandbox Code Playgroud)

这成为了导致其忙碌的违规进程的 PID - 20416(/proc/

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

[devops@dp01app5030 SeGrid]$ ps -p 20416
  PID TTY          TIME CMD
20416 ?        00:00:19 ntpd
Run Code Online (Sandbox Code Playgroud)

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

结果我不得不重新启动 ntp 守护进程并解决了这个问题!!!


use*_*442 6

grep 656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3 /proc/*/mountinfo
Run Code Online (Sandbox Code Playgroud)

然后找到pid 656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3and并杀死它


Sun*_*nny 5

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

# docker volume rm $(docker volume ls -qf dangling=true)
# docker rm $(docker ps -q -f 'status=exited')
Run Code Online (Sandbox Code Playgroud)

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

# service docker restart
Run Code Online (Sandbox Code Playgroud)


小智 5

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

然后

  1. 我尝试:docker system prune -a它第一次没用
  2. 我重新启动系统
  3. 我再试一次docker system prune -a.这次它有效.它会发出一条警告信息,最后问"你确定要继续吗?是吗?答案.答案:是的.时间到最后,死人的容器都消失了.
  4. 验证 docker ps -a

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