最近遇到一个问题, 当我在docker里重新部署某个服务的时候,执行完sh 命令或者docker-compose up -d命令后服务启动不成功,还报了个device or resource busy的错。
然后我docker ps一看,好家伙,不仅启动不成功,服务还没了。
这是因为docker 部署的时候会将原本的东西全部 rm一遍然后才又重新构建。
看一下当时报错内容:
failed to remove root filesystem for 9b13c255d03757c456651506ada5566a5b5e5a87b851e3621dcejf823: remove /var/lib/docker/overlay/9b13c255d03757c456651506adaa2fb660f75a5b5e5a87b851e3621dce0a368d/merged: device or resource busy
主要看,是报了:device or resource busy, 这意思是说设备或资源繁忙,你没法删除这个资源啊。
然后我去到了/var/lib/docker/overlay/9b13c255d03757c456651506adaa2fb660f75a5b5e5a87b851e3621dce0a368d/merged 这目录下一看,是空的,手动删除也不行。
解决办法
1. 查找占用此目录的进程
命令:grep id /proc/*/mounts
示例如下:
grep 9b13c255d03757c456651506adaa2fb660f75a5b5e5a87b851e3621dce0a368d /proc/*/mounts
执行命令后很明显看到有两个进程正在使用它:
/proc/25086/mounts:overlay /data0/docker/overlay2/9b13c255d03757c456651506adaa2fb660f75a5b5e5a87b851e3621dce0a368d /merged overlayrw,relatime,lowerdir=/data0/docker/overlay2/l/F4BQHNVPHGRKWXFRUIHXUMAHZ2:/data0/docker/overlay2/l/.....
/proc/25065/mounts:overlay /data0/docker/overlay2/9b13c255d03757c456651506adaa2fb660f75a5b5e5a87b851e3621dce0a368d /merged overlayrw,relatime,lowerdir=/data0/docker/overlay2/l/......
2. 杀死进程
命令:kill -9 进程id
示例如下:
kill -9 25086
kill -9 25065
注意:有些进程能不能直接进行删除要看清楚,一股脑删除了万一影响到别的服务就不好了。
3. 继续操作删除目录,成功
命令: rm -rf 报错的文件路径
示例:
rm -rf /var/lib/docker/overlay/9b13c255d03757c456651506adaa2fb660f75a5b5e5a87b851e3621dce0a368d/merged
删除这个目录文件后再重新执行 sh 或者 docker-compose up -d 命令启动服务, 则启动成功了!