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

Flask+uWSGI Docker容器健康检查异常但服务正常的排查求助

问题原因及解决方案

核心问题

你的Flask容器健康检查失败,本质原因是uWSGI没有监听5000 TCP端口——当前uWSGI配置的是Unix域套接字api.sock,仅用于和Nginx通信,容器内部的localhost:5000并没有HTTP服务在运行,所以curl http://localhost:5000/必然失败。

另外注意你的Dockerfile里的CMD命令存在语法错误(缺少闭合的双引号),虽然可能暂时不影响启动,但建议修正。


解决方案(两种可选)

方案一:直接通过Unix套接字做健康检查

这种方式不需要修改uWSGI的监听配置,更符合当前架构:

  1. 添加健康检查路由
    在Flask的__init__.py中,给应用添加一个专门的健康检查接口:
from flask import Flask

def create_app():
    app = Flask(__name__)

    # 原有配置保留
    @app.route('/health')
    def health_check():
        return 'OK', 200
    
    return app
  1. 修改Docker Compose的健康检查命令
    用curl直接访问Unix套接字,指定健康检查路由:
flask:
    # 其他配置不变
    healthcheck:
      test: curl --fail --unix-socket /app/api.sock http://localhost/health || exit 1
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 30s

注:/app/api.sock是容器内的套接字路径,和uwsgi.ini中配置的socket=api.sock对应(因为WORKDIR是/app)。

方案二:让uWSGI额外监听本地TCP端口

如果偏好用HTTP端口做健康检查,可以让uWSGI同时监听Unix套接字和本地TCP端口:

  1. 修改uwsgi.ini配置
    添加本地HTTP监听(仅容器内部可访问,无需暴露给外部):
[uwsgi]
module = wsgi:app
master = true
processes = 5
enable-threads = true
single-interpreter = true

buffer-size = 32768

socket= api.sock
chmod-socket = 664
uid = www-data
gid = www-data

# 添加本地HTTP监听,仅用于健康检查
http=127.0.0.1:5000
  1. 添加健康检查路由(推荐)
    和方案一一样,在Flask中添加/health路由,然后修改健康检查命令:
healthcheck:
  test: curl --fail http://localhost:5000/health || exit 1
  interval: 30s
  timeout: 10s
  retries: 5
  start_period: 30s

额外修正

修正Dockerfile中的CMD语法错误:

# 原错误命令
# CMD ["uwsgi", "--ini", "uwsgi.ini"

# 修正后
CMD ["uwsgi", "--ini", "uwsgi.ini"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:55:36