Docker容器内Python测试异常、构建失败,需重启Docker才能解决的问题求助
Docker环境下Python测试挂起及构建超时问题
问题描述
- 初始操作:使用
docker-compose up -d --build启动所有服务,构建完成后运行正常;通过docker exec -it <name> /bin/bash进入容器执行py.test <path to file>,测试运行正常。 - 异常现象:
- 修改容器内Python文件后,执行
py.test陷入挂起,无法运行。 - 退出容器后重新执行
docker-compose up -d --build,出现镜像拉取超时错误:
- 修改容器内Python文件后,执行
=> ERROR [internal] load metadata for docker.io/mdillon/postgis:10 ------ > [internal] load metadata for docker.io/mdillon/postgis:10: ------ failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to do request: Head "https://registry-1.docker.io/v2/mdillon/postgis/manifests/10": proxyconnect tcp: dial tcp: lookup http.docker.internal on 192.xxx.xx.x:xx: read udp 192.xxx.xx.x:xxxxx->192.xxx.xx.x:xx: i/o timeout ERROR: Service 'pgdb' failed to build : Build failed
- 临时解决方案:通过Docker仪表盘或服务重启Docker应用,几秒后恢复正常,再次执行
docker-compose可正常运行,测试也能正常执行。 - 补充信息:
- 连接公司VPN与否对问题无影响。
- 更新:无需修改文件,Docker运行一段时间后执行
py.test也会挂起,仅靠退出容器、重启Docker、重新执行docker-compose可恢复。 - 更新2:停止所有容器后重启无法解决问题,必须重启Docker应用再重启容器才能恢复。
问题原因分析
1. Docker网络栈与DNS解析异常
错误日志明确显示lookup http.docker.internal超时,说明Docker内部DNS解析机制出现故障,无法正常解析代理或镜像仓库地址。Docker运行过程中,网络栈可能因连接堆积、资源泄漏等问题逐渐失效:
- 镜像拉取时因无法解析代理地址,出现连接超时;
- 容器内的
py.test进程可能因依赖的数据库等服务连接异常,陷入无限等待状态。
仅重启容器无法重置Docker全局网络栈,只有重启Docker应用才能彻底刷新网络配置和DNS缓存,恢复解析能力。
2. Docker守护进程资源泄漏
Docker守护进程(dockerd)长期运行后,可能出现内存泄漏、线程堆积等问题,导致其无法正常处理容器请求、网络请求或镜像拉取操作:
- 守护进程状态异常时,容器内的进程调度、资源分配会受影响,引发
py.test挂起; - 镜像拉取请求无法被正常处理,出现超时错误。
重启Docker应用会重置守护进程状态,释放占用的资源,恢复正常服务能力。
3. 容器文件系统与进程状态异常
直接修改容器内的Python文件会创建Docker可写层,长期运行或频繁修改可能导致分层文件系统出现异常:
- 文件句柄泄漏、资源占用异常,导致后续
py.test执行时出现死锁; - 即使未修改文件,容器内进程长期运行后内存、文件描述符耗尽,也会引发测试进程挂起。
仅重启容器无法修复文件系统的分层异常,需重启Docker应用配合重新构建容器来解决。
4. 代理配置隐性冲突
错误日志提到proxyconnect tcp,说明Docker配置了代理,但代理地址http.docker.internal无法被解析:
- 即使未连接VPN,Docker的代理配置可能残留无效设置,或代理服务本身异常,导致镜像拉取时无法正常通过代理连接Docker Hub;
- 重启Docker会重新加载代理配置,暂时修复连接问题。
内容的提问来源于stack exchange,提问作者Em Ae
相关产品推荐
相关产品推荐

