You need to enable JavaScript to run this app. 停电重启后树莓派Zero内Docker容器requests请求出现连接错误如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

停电重启后树莓派Zero内Docker容器requests请求出现连接错误如何解决?

问题根因

你遇到的报错本质是Docker容器启动时机早于宿主机网络初始化完成导致的:
树莓派Zero开机时,Docker服务会在网卡配置、DNS配置落地之前就完成启动,此时创建运行的容器会直接拷贝宿主机当前未就绪的无效DNS配置存入容器内的/etc/resolv.conf,即便后续宿主机网络恢复正常,容器内的DNS配置也不会自动更新,因此一直出现域名解析失败。手动重启容器时宿主机网络已完全就绪,容器能拿到正确的DNS配置,所以请求恢复正常。

修复方案

方案1:调整Docker服务启动顺序(推荐,一劳永逸)

修改systemd中Docker的启动依赖,强制Docker等待网络完全就绪后再启动:

  1. 编辑Docker服务配置文件:sudo systemctl edit docker.service
  2. 写入如下配置:
[Unit]
After=network-online.target
Wants=network-online.target
  1. 保存退出后重载systemd配置:sudo systemctl daemon-reload
  2. 重启Docker服务生效:sudo systemctl restart docker

方案2:给Docker配置固定全局DNS

直接强制所有Docker容器使用你指定的公共DNS,不受宿主机临时DNS状态影响:

  1. 编辑Docker daemon配置文件(不存在就新建):sudo nano /etc/docker/daemon.json
  2. 写入如下内容:
{
  "dns": ["1.1.1.1", "1.0.0.1", "8.8.8.8"]
}
  1. 保存退出后重启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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 10:18:00