Flask+Gunicorn容器内requests域名解析失败问题求助
问题排查与解决:Docker+Gunicorn部署Flask后API请求DNS解析失败
错误信息
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='ana.gov.br', port=443): Max retries exceeded with url: /hidrowebservice/EstacoesTelemetricas/OAUth/v1 (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f69d27a6a50>: Failed to resolve 'ana.gov.br' ([Errno -3] Lookup timed out)"))
触发问题的路由代码
@observatorioBp.route("/teste") def teste(): url_ana_login = r"https://ana.gov.br/hidrowebservice/EstacoesTelemetricas/OAUth/v1" response = requests.get( url_ana_login, headers={ "identificador": IDENTIFICATOR_API_ANA, "senha": PASSWORD_API_ANA, }, ) return response.json()
核心矛盾
开发服务器运行正常,Docker容器内交互式shell执行相同请求成功,但Gunicorn启动的Flask应用请求API时出现DNS解析超时。
可能原因及解决方法
1. Gunicorn进程DNS配置继承异常
Docker容器启动时shell的DNS配置正常,但Gunicorn启动的worker进程可能未正确继承容器DNS设置,或存在缓存冲突。
解决方法:
- 启动Gunicorn时显式指定DNS服务器:
gunicorn --workers=4 --bind=0.0.0.0:5000 --dns=8.8.8.8 app:app - 在Dockerfile中添加环境变量强制继承系统DNS配置:
ENV RESOLV_CONF=/etc/resolv.conf
2. Docker网络模式限制
自定义网络或默认bridge网络的DNS配置可能存在隔离问题。
解决方法:
- 测试时临时使用主机网络(生产环境慎用):
docker run --network=host your-image-name - 创建自定义网络并指定DNS服务器:
docker network create --dns=8.8.8.8 --dns=8.8.4.4 my-network docker run --network=my-network your-image-name
3. Gunicorn异步Worker兼容性问题
使用gevent等异步worker时,可能存在DNS解析兼容性bug。
解决方法:
- 切换为同步worker类型:
gunicorn --workers=4 --bind=0.0.0.0:5000 --worker-class=sync app:app - 若必须使用异步worker,安装
gevent-dns修复解析问题:pip install gevent-dns
4. 容器内DNS解析工具异常
Gunicorn进程可能未使用系统默认解析工具,或存在缓存异常。
解决方法:
- 在Dockerfile中安装DNS测试工具,启动前先验证解析:
启动脚本中添加前置验证:RUN apt-get update && apt-get install -y dnsutilsnslookup ana.gov.br - 清空容器内DNS缓存(系统支持时):
systemd-resolve --flush-caches
内容的提问来源于stack exchange,提问作者user25772975
相关产品推荐
相关产品推荐

