当尝试删除 docker 容器时(例如尝试
docker-compose down
时),我总是收到以下错误:
ERROR: for <my_container> container d8424f80ef124c2f3dd8f22a8fe8273f294e8e63954e7f318db93993458bac27: driver "overlay2" failed to remove root filesystem: unlinkat /var/lib/docker/overlay2/64311f2ee553a5d42291afa316db7aa392a29687ffa61971b4454a9be026b3c4/merged: device or resource busy
重新启动 docker 服务、修剪或强制删除容器等常见建议不起作用。我发现唯一有效的是使用
sudo umount /home/virtfs/xxxxx/var/lib/docker/overlay2/<container_id>/merged
手动卸载,然后我就可以删除容器。
我的操作系统是
CentOS Linux release 7.9.2009 (Core)
,内核版本为 3.10.0-1127.19.1.el7.x86_64
。我认为这可能是由于 overlay2 与 CentOS 冲突,但根据 this page 我的 CentOS/内核版本应该可以工作。找到解决方案会很棒,因为我理想情况下希望 docker-compose down
而不必事先使用提升的权限来卸载。
从错误日志中观察到涉及到文件挂载 执行以下命令查看相关进程
grep 64311f2ee553a5d42291afa316db7aa392a29687ffa61971b4454a9be026b3c4 /proc/*/mountinfo
ps -ef | grep "The process ID obtained by the grep command above"
停止被占用的进程
然后删除容器
当没有进程被列为阻塞时,通常会发生这种情况,那么您就知道这是内核模块阻塞了它。
最有可能的罪魁祸首是
nfs
(不知道为什么你会在docker中运行它),或者是docker内绑定安装的文件,有时是自动文件,比如可能是由systemd-networkd创建的文件。
Overlay2 被 Ubuntu 淘汰是有原因的。 CentOS 已结束生命周期,因此这个问题可能已经在您最有可能的升级路径(升级到 Rocky Linux)中得到解决。或者,您可以进入迁移 docker 存储引擎的丛林。
或者,如果可以的话,您可以首先删除占用它的软件包或软件。但您必须分享更多有关这方面的信息才能获得帮助。