Flask+uWSGI Docker容器健康检查异常但服务正常的排查求助
问题原因及解决方案
核心问题
你的Flask容器健康检查失败,本质原因是uWSGI没有监听5000 TCP端口——当前uWSGI配置的是Unix域套接字api.sock,仅用于和Nginx通信,容器内部的localhost:5000并没有HTTP服务在运行,所以curl http://localhost:5000/必然失败。
另外注意你的Dockerfile里的CMD命令存在语法错误(缺少闭合的双引号),虽然可能暂时不影响启动,但建议修正。
解决方案(两种可选)
方案一:直接通过Unix套接字做健康检查
这种方式不需要修改uWSGI的监听配置,更符合当前架构:
- 添加健康检查路由
在Flask的__init__.py中,给应用添加一个专门的健康检查接口:
from flask import Flask def create_app(): app = Flask(__name__) # 原有配置保留 @app.route('/health') def health_check(): return 'OK', 200 return app
- 修改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端口:
- 修改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
- 添加健康检查路由(推荐)
和方案一一样,在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
相关产品推荐
相关产品推荐

