You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Togglebox部署Docker+Django遇socket.gaierror启动失败求助

问题:Togglebox部署Django项目时出现socket.gaierror导致服务崩溃

我在Togglebox上部署一个基于Django的多Docker容器项目,通过Nginx做路由。部署时触发socket.gaierror: [Errno -2] Name or service not known错误,直接导致服务启动失败。

完整运行日志:

162 static files copied to '/nfs/static', 3 unmodified.
[2024-05-09 21:44:58 +0000] [5924] [INFO] Starting gunicorn 21.2.0
[2024-05-09 21:44:58 +0000] [5924] [INFO] Listening at: http://0.0.0.0:8115 (5924)
[2024-05-09 21:44:58 +0000] [5924] [INFO] Using worker: sync
[2024-05-09 21:44:58 +0000] [5996] [INFO] Booting worker with pid: 5996
Could not connect to host.docker.internal: 5115
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/_pydevd_bundle/pydevd_comm.py", line 463, in start_client
    s.connect((host, port))
socket.gaierror: [Errno -2] Name or service not known
[2024-05-09 21:44:59 +0000] [5996] [ERROR] Exception in worker process
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/gunicorn/arbiter.py", line 609, in spawn_worker
    worker.init_process()
  File "/usr/local/lib/python3.11/site-packages/gunicorn/workers/base.py", line 134, in init_process
    self.load_wsgi()
  File "/usr/local/lib/python3.11/site-packages/gunicorn/workers/base.py", line 146, in load_wsgi
    self.wsgi = self.app.wsgi()
                ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/gunicorn/app/base.py", line 67, in wsgi
    self.callable = self.load()
                    ^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 58, in load
    return self.load_wsgiapp()
           ^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 48, in load_wsgiapp
    return util.import_app(self.app_uri)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/gunicorn/util.py", line 371, in import_app
    mod = importlib.import_module(module)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1204, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1176, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 940, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/code/adentify/wsgi.py", line 21, in <module>
    pydevd_pycharm.settrace(
  File "/usr/local/lib/python3.11/site-packages/pydevd.py", line 1706, in settrace
    _locked_settrace(
  File "/usr/local/lib/python3.11/site-packages/pydevd.py", line 1762, in _locked_settrace
    debugger.connect(host, port)  # Note: connect can raise error.
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/pydevd.py", line 660, in connect
    s = start_client(host, port)
        ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/_pydevd_bundle/pydevd_comm.py", line 463, in start_client
    s.connect((host, port))
socket.gaierror: [Errno -2] Name or service not known
[2024-05-09 21:44:59 +0000] [5996] [INFO] Worker exiting (pid: 5996)
[2024-05-09 21:44:59 +0000] [5924] [ERROR] Worker (pid:5996) exited with code 3
[2024-05-09 21:44:59 +0000] [5924] [ERROR] Shutting down: Master
[2024-05-09 21:44:59 +0000] [5924] [ERROR] Reason: Worker failed to boot.

日志里的Could not connect to host.docker.internal: 5115是连接调试端口的报错,本地其他Git分支运行时这个错误不会导致服务崩溃,但部署到Togglebox就触发致命错误。之前相同部署流程能正常启动,当前分支执行相同步骤失败,怀疑是配置问题但不知道从哪排查。


解决方案

核心原因

报错根源是PyCharm调试代码pydevd_pycharm.settrace()在生产环境(Togglebox)中仍被启用,尝试解析host.docker.internal时DNS解析失败,而生产环境没有调试服务,导致连接失败直接终止进程。本地环境中可能调试服务存在或代码有容错逻辑,所以不会崩溃。

排查&修复步骤

  • 检查wsgi.py文件:定位第21行的pydevd_pycharm.settrace()代码,确认是否在生产环境中被执行。
  • 通过环境变量控制调试逻辑:修改代码,只有在特定环境变量存在时才启动调试,避免生产环境触发:
    # 在wsgi.py中修改
    import os
    if os.environ.get('ENABLE_PYDEV_DEBUG') == 'True':
        import pydevd_pycharm
        pydevd_pycharm.settrace(
            # 你的调试配置参数
        )
    
  • 确认Togglebox部署环境的环境变量:确保生产环境中没有设置ENABLE_PYDEV_DEBUG这类调试开关,或者明确设为False。
  • 检查Docker镜像构建逻辑:确认当前分支是否在构建镜像时意外包含了调试代码或依赖,比如是否在生产镜像中安装了pydevd-pycharm包。建议用多阶段构建,只在开发阶段安装调试依赖:
    # 开发阶段安装调试依赖
    RUN pip install pydevd-pycharm
    # 生产阶段复用基础镜像,只保留运行必需的依赖
    
  • (可选)验证DNS解析:如果确实需要在Togglebox环境中使用host.docker.internal,可以在容器内执行nslookup host.docker.internal检查解析情况,若无法解析则手动在容器/etc/hosts中添加映射,但生产环境不建议这么做,优先禁用调试逻辑。

内容的提问来源于stack exchange,提问作者BenSmithAtFaraday

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 07:27:06