Ubuntu环境下aiodocker的containers.get/delete方法卡住问题排查求助
问题排查方案与aiodocker已知问题说明
排查步骤
- 检查Docker daemon状态
- 执行
systemctl status docker查看daemon运行状态,确认是否有资源耗尽、进程僵死等异常 - 实时查看Docker日志:
journalctl -u docker.service -f,在调用aiodocker接口时观察是否有请求阻塞、报错日志
- 执行
- 分析异常容器的元数据与存储状态
- 用
docker inspect <ident>查看容器的详细信息,重点检查挂载点、网络配置、存储层是否有异常(比如挂载目录不存在、存储文件损坏) - 对比正常机器的Docker存储驱动:
docker info | grep Storage Driver,确认异常机器的存储驱动是否出现故障
- 用
- 绕过aiodocker直接调用Docker API验证
- 用curl测试Docker原生API:
- 获取容器:
curl --unix-socket /var/run/docker.sock http://localhost/containers/<ident>/json - 删除容器:
curl -X DELETE --unix-socket /var/run/docker.sock http://localhost/containers/<ident>
如果curl也卡住,说明问题出在Docker daemon而非aiodocker;如果curl正常,则定位到aiodocker的客户端问题
- 获取容器:
- 用curl测试Docker原生API:
- 检查Python应用的连接状态
- 查看Python进程的文件描述符:
lsof -p <python进程ID>,确认是否有大量未关闭的Docker API连接导致阻塞 - 重启Python应用,验证是否能恢复正常,排除应用内部连接池异常
- 查看Python进程的文件描述符:
aiodocker已知问题核对
aiodocker 0.21.0存在部分与Docker API交互的阻塞问题,尤其是处理异常状态容器时:
- 当容器处于半销毁状态(如存储层未完全清理),aiodocker的异步请求因未默认设置超时,会出现永久挂起
- 该版本中,
containers.get()在处理已删除但daemon缓存未刷新的容器时,会无限等待,因为API返回的异常状态未被正确处理
临时修复方案
- 手动为aiodocker调用添加超时逻辑:
import asyncio import subprocess async def safe_delete_container(client, ident): try: container = await asyncio.wait_for(client.containers.get(ident), timeout=10) await asyncio.wait_for(container.delete(), timeout=10) except asyncio.TimeoutError: # 超时后调用原生docker命令强制删除 subprocess.run(["docker", "rm", "-f", ident], check=True, capture_output=True) - 升级aiodocker到0.23.0及以上版本,后续版本修复了多个异步请求超时处理的问题
- 清理Docker缓存与无效资源:
docker system prune -f,清除残留的无效容器元数据
内容的提问来源于stack exchange,提问作者frans
相关产品推荐
相关产品推荐

