停电重启后树莓派Zero内Docker容器requests请求出现连接错误如何解决?
问题根因
你遇到的报错本质是Docker容器启动时机早于宿主机网络初始化完成导致的:
树莓派Zero开机时,Docker服务会在网卡配置、DNS配置落地之前就完成启动,此时创建运行的容器会直接拷贝宿主机当前未就绪的无效DNS配置存入容器内的/etc/resolv.conf,即便后续宿主机网络恢复正常,容器内的DNS配置也不会自动更新,因此一直出现域名解析失败。手动重启容器时宿主机网络已完全就绪,容器能拿到正确的DNS配置,所以请求恢复正常。
修复方案
方案1:调整Docker服务启动顺序(推荐,一劳永逸)
修改systemd中Docker的启动依赖,强制Docker等待网络完全就绪后再启动:
- 编辑Docker服务配置文件:
sudo systemctl edit docker.service - 写入如下配置:
[Unit] After=network-online.target Wants=network-online.target
- 保存退出后重载systemd配置:
sudo systemctl daemon-reload - 重启Docker服务生效:
sudo systemctl restart docker
方案2:给Docker配置固定全局DNS
直接强制所有Docker容器使用你指定的公共DNS,不受宿主机临时DNS状态影响:
- 编辑Docker daemon配置文件(不存在就新建):
sudo nano /etc/docker/daemon.json - 写入如下内容:
{ "dns": ["1.1.1.1", "1.0.0.1", "8.8.8.8"] }
- 保存退出后重启Docker服务生效:
sudo systemctl restart docker
方案3:给容器增加网络就绪等待逻辑
在你的Python容器启动入口增加网络检测步骤,确认DNS可用后再启动业务程序:
比如在容器的entrypoint.sh中加入如下逻辑:
#!/bin/bash # 等待DNS解析正常 until nslookup mywebsite.com > /dev/null 2>&1; do echo "等待DNS就绪,1秒后重试..." sleep 1 done # 启动你的Python业务程序 python3 your_scan_script.py
同时记得给entrypoint加执行权限,修改Dockerfile使用该脚本作为启动入口即可。
方案4:代码层面增加重试逻辑(应急方案)
在Python代码的requests请求外增加对域名解析错误的重试逻辑,适合临时兜底避免业务中断:
import requests import time from requests.exceptions import ConnectionError def request_with_retry(url, max_retries=5, retry_interval=3): for _ in range(max_retries): try: return requests.get(url, timeout=10) except ConnectionError as e: if "Temporary failure in name resolution" in str(e): time.sleep(retry_interval) continue raise raise Exception("达到最大重试次数,请求失败")
内容的提问来源于stack exchange,提问作者Ripper346
相关产品推荐
相关产品推荐

