删除Docker容器或者重启Docker Daemon时,遇到device or resource busy,该怎么办?

前段时间,在内部的线上环境修复Kubernetes集群时,需要重启Docker Daemon,可以悲剧发生了,一重启就报错:device or resource busy。Google了好久,终于找到了类似的案例和解决方法。此时才知道,原来删除Docker容器,也可能会出现这个问题。这里简单记录一下,原创详见“参考资料”。

原文给出的脚本:

1
2
3
4
5
6
7
#!/bin/bash

for i in $(curl -s --unix /var/run/docker.sock http://localhost/info | jq -r .DockerRootDir) /var/lib/docker /run /var/run; do
for m in $(tac /proc/mounts | awk '{print $2}' | grep ^${i}/); do
umount $m || true
done
done

在我们内部的环境中,DockerRootDir是固定的,就在/var/lib/docker,为了避免安装jq依赖,调整为下面的脚本:

1
2
3
4
5
6
7
#!/bin/bash

for i in /var/lib/docker /run /var/run; do
for m in $(tac /proc/mounts | awk '{print $2}' | grep ^${i}/); do
umount $m || true
done
done

参考资料:
http://niusmallnan.com/2016/12/27/docker-device-resource-busy/