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
相关产品推荐
相关产品推荐

