Skip to content

修复 Docker 容器内 DNS 解析失败导致 /summary 接口返回 500 #37

Description

@cnmeeia

问题描述

调用 /summary 接口时返回 HTTP 500,日志显示无法解析上游服务域名:

requests.exceptions.ConnectionError:
HTTPSConnectionPool(host='appfuwu.189.cn', port=9021):
Max retries exceeded with url:
/query/qryImportantData

Caused by NameResolutionError:
Failed to resolve 'appfuwu.189.cn'

影响

容器 china-telecom-monitor 无法访问中国电信上游接口:

https://appfuwu.189.cn:9021/query/qryImportantData

导致 /summary 请求失败并返回 500。

原因

宿主机 DNS 解析正常,但 Docker 容器内 DNS 解析失败:

gaierror(-3, 'Try again')

处理过程

临时修改容器 DNS 配置:

docker exec -u 0 china-telecom-monitor sh -c \
  'printf "nameserver 223.5.5.5\nnameserver 114.114.114.114\n" > /etc/resolv.conf'

验证容器内域名解析:

docker exec china-telecom-monitor getent hosts appfuwu.189.cn

验证 Python 请求:

status: 200

确认 DNS、TCP、TLS 和 HTTP POST 请求均已恢复。

修复建议

在 Docker Compose 中持久化 DNS 配置:

services:
  app:
    dns:
      - 223.5.5.5
      - 114.114.114.114

重新创建容器:

docker compose up -d --force-recreate

同时为上游请求增加超时和异常处理,避免网络故障直接导致未处理的 500:

response = self.session.post(
    url,
    headers=self.headers,
    json=body,
    timeout=(10, 30),
)

建议将上游连接失败映射为 503 Service Unavailable,而不是直接返回 500

验证结果

  • 容器内 DNS 解析恢复
  • appfuwu.189.cn:9021 连接正常
  • 上游 POST 请求返回 HTTP 200
  • /summary 接口恢复正常

注意事项

测试时使用了 verify=False,产生了 InsecureRequestWarning。生产环境应启用 TLS 证书验证,并确保容器内已安装 ca-certificates

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions