我正在尝试获取Flask Docker容器的健康状态。这个容器没有暴露端口5000,它与wsgi服务器对话,然后我使用Nginx作为Flask的套接字代理。Flask容器正在运行Flask和uwsgi。我能够在Nginx上进行健康检查,但不是在Flask容器上。每次我检查健康状态时,Flask容器都显示为不健康。虽然它显示为不健康,但站点和API功能齐全。这是在一个开发环境的时刻.我已经尝试了只是localhost和localhost:5000上的portcheck和似乎没有为我工作,都返回不健康.不知道我做错了什么.
uwsgi.ini:
[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
wsgi.py
from flask_project import create_app
app = create_app()
if __name__ == '__main__':
app.run(debug=True)
init.py
from flask import Flask
def create_app():
app = Flask(__name__)
## internal configs here
return app
Dockerfile:
FROM python:3.9.7-slim-buster
WORKDIR /app
RUN apt-get update && apt-get install -y build-essential python-dev libssl-dev openssl procps curl
COPY ./ .
RUN pip3 install -r requirements.txt
CMD ["uwsgi", "--ini", "uwsgi.ini"
Docker-compose:
---
version: "3.7"
services:
flask:
build:
context: ./docker
container_name: flask
environment:
- CONTAINER=flask
volumes:
- ./app/:/app
restart: on-failure
stdin_open: true
healthcheck:
test: curl --fail http://localhost:5000/ || exit 1
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
nginx:
image: nginx:latest
container_name: nginx
depends_on:
- flask
volumes:
- ./nginx_config:/etc/nginx/conf.d
- ./app/:/app
restart: on-failure
ports:
- "80:80"
- "443:443"
healthcheck:
test: curl --fail http://localhost/ || exit 1
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
1条答案
按热度按时间von4xj4u1#
在
flask
服务的healthcheck
中,尝试使用test: curl --fail http://nginx/ || exit 1
。我相信这与Docker如何处理网络名称空间有关。在
flask
容器中,localhost
专门指向flask
容器的网络地址,而不是容器正在运行的网络地址。flask
容器中没有任何东西在监听端口5000
,因为,正如你所说,你没有暴露它。它是nginx
容器在监听流量(并使用从主机地址上的443
和80
到其自身地址上的443
和80
的端口转发),所以你必须将curl
命令指向nginx
容器的地址。它对nginx
容器有效,因为在该容器的上下文中,localhost
指向它自己。顺便说一句,我在试图弄清楚将健康检查放在
flask
容器、nginx
容器或两者上是否是最佳实践时遇到了这个问题。