Docker - 无法删除已停止的容器

104

我无法删除已停止的容器,每当我重新启动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
你好,这仍然是一个当前问题,但目前被接受的答案不再有效,并且存在相当大的风险。有umount的答案,是一个很好的选择,如果可能的话,请接受那个答案。 - Daniel F
“umount” 的解决方案已经不可行了,因为它不允许在资源被占用时卸载。同样地,杀死负责的 pid 也无法解决问题。 - runr
26个回答

0
在我的情况下,Docker 容器内实际上没有挂载点。在特权容器中进行了一些 ifup/down 操作后引发了错误。通常的删除容器方式也无法解决问题,会出现类似的错误提示:
user@server:~$ docker rm -f tklc.dead
Error response from daemon: containers 896c259600c951323d5db4438d8faaa0de9de4b0cf0b998ab0896e82ec1b3769: driver "overlay2" failed to remove root filesystem: unlinkat /var/lib/docker/overlay2/3670d1e338eaf11b8fc7ada95a91995417fa3bb4ac1c36928c3c4195525988d4/diff/var/spool/postfix/dev/urandom: operation not permitted

也没有任何尝试卸载内部的任何链接或挂载点。也没有找到并停止与死容器相关的任何进程。也没有任何直接删除文件的尝试成功。

user@server:~$ sudo rm -rf /var/lib/docker/overlay2/3670d1e338eaf11b8fc7ada95a91995417fa3bb4ac1c36928c3c4195525988d4/
rm: cannot remove '/var/lib/docker/overlay2/3670d1e338eaf11b8fc7ada95a91995417fa3bb4ac1c36928c3c4195525988d4/diff/var/spool/postfix/dev/urandom': Operation not permitted
rm: cannot remove '/var/lib/docker/overlay2/3670d1e338eaf11b8fc7ada95a91995417fa3bb4ac1c36928c3c4195525988d4/diff/var/spool/postfix/dev/random': Operation not permitted

最后,我列出了防止Docker容器被删除的文件。


user@server:~$ sudo ls -l /var/lib/docker/overlay2/3670d1e338eaf11b8fc7ada95a91995417fa3bb4ac1c36928c3c4195525988d4/diff/var/spool/postfix/dev
total 0
---------- 1 root root 0 окт 31 18:17 random
---------- 1 root root 0 окт 31 18:17 urandom

太棒了!没有访问文件的权限,即使是超级用户也不行!这肯定是扩展属性的问题。

user@server:~$ sudo lsattr /var/lib/docker/overlay2/3670d1e338eaf11b8fc7ada95a91995417fa3bb4ac1c36928c3c4195525988d4/diff/var/spool/postfix/dev/urandom
----i----------------- /var/lib/docker/overlay2/3670d1e338eaf11b8fc7ada95a91995417fa3bb4ac1c36928c3c4195525988d4/diff/var/spool/postfix/dev/urandom

就是这样。不错。在更改不可变位之后,我们将能够重试删除容器本身或其任何文件。最后

user@server:~$ sudo chattr -i /var/lib/docker/overlay2/3670d1e338eaf11b8fc7ada95a91995417fa3bb4ac1c36928c3c4195525988d4/diff/var/spool/postfix/dev/random
user@server:~$ docker ps -a|grep ‘Dead|Removal’|sed -e 's/\s.*$//'|xargs docker rm
896c259600c9

vou a la.


0
在Windows Server 2022上运行Docker时遇到了类似的问题。
问题是Hyper-V主机计算服务被停止了。

0

尝试这个,在CentOS上对我有效: 1)docker container ls -a 给你一个容器列表,检查你想要摆脱的状态 enter image description here 2)docker container rm -f 97af2da41b2b 不是很喜欢强制标志,但可以解决问题 要检查它是否起作用,只需再次执行命令或列出它。 enter image description here 3)继续直到我们清除所有死亡容器 enter image description here


0

我在 Windows 右下角重新启动了 Docker 代理,点击 docker 图标,选择 Restart Docker。然后我运行了 docker ps -a 命令,发现容器仍然存在。 接着我运行了 docker rm -f 容器 ID,这对我起作用了。


0

如果您是Mac/Windows用户并且安装了Docker Desktop,您可以简单地重启Docker Desktop,在UI中轻松删除容器而不会出现任何复杂情况。


0
这对我来说真是个噩梦,你刚整理好一些问题,另外一些问题又冒出来了。
根据这个帖子中的想法,我解决了一些问题,但同时也出现了其他问题。特别是创建缺失的数据集,然后停止和启动Docker服务似乎有所帮助,再加上上面的命令来删除无效的容器。
为了可能帮助缩小问题发生的原因,我认为这个问题只在unraid添加了他们自己的本地ZFS设置后开始出现。在那之前,我使用的是zfs插件,要么:
1. Docker没有为每个docker镜像创建zfs数据集,一切都很好,或者 2. 这是因为我使用了镜像模式
那是很久以前的事了,但我相当有信心是选项1,使用文件夹模式,因此数据集不会自动创建。我讨厌那些数据集,我认为它们完全没有意义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接