You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的客户端问题
  • 检查Python应用的连接状态
    • 查看Python进程的文件描述符:lsof -p <python进程ID>,确认是否有大量未关闭的Docker API连接导致阻塞
    • 重启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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:50:17