Docker 总是会碰到各种问题,很多甚至完全找不到原因。docker cli确实不可靠,有时候已经显示了done,但是并没有生效,好在docker开发如火如荼,碰到的问题也会越来越少。docker 碰到问题后常用的办法就是删掉所有container和networks然后重启就好了,这里不会丢掉任何数据。这里不得不说“-f”这个神奇的参数,比如docker rm xxx失败可能是因为没有stop掉,但是如果-f了它会自己stop,完了还总是出错,出错就出错吧,container还是能被删掉,好奇怪的东西。
回归主题,出现这个错误后我把所有容器都删除了,结果并没用用使用docker network inspect查看后发现network这边并没有随之删除,好奇怪的bug,难道删除容器时network就这么无视么。这里要用docker network disconnect -f [networkid] [containerid] 来删除,下面写了一个脚本,disconnect所有network下的所有容器,并删除所有容器。
docker network ls -q | while read networkid; do echo "network:$networkid" docker network inspect $networkid | jq -r '.[0].Containers | keys[]' | while read endpoint; do echo "docker network inspect $networkid | jq -r ".[0].Containers[\"$endpoint\"].Name"" container=$(docker network inspect $networkid | jq -r ".[0].Containers[\"$endpoint\"].Name") echo "docker network disconnect -f $networkid $container" docker network disconnect -f $networkid $container done done docker rm -f $(docker ps -a -q)