Flask Docker运行状况检查

lb3vh1jj  于 2023-04-11  发布在  Docker
关注(0)|答案(1)|浏览(231)

我正在尝试获取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
von4xj4u

von4xj4u1#

flask服务的healthcheck中,尝试使用test: curl --fail http://nginx/ || exit 1
我相信这与Docker如何处理网络名称空间有关。在flask容器中,localhost专门指向flask容器的网络地址,而不是容器正在运行的网络地址。flask容器中没有任何东西在监听端口5000,因为,正如你所说,你没有暴露它。它是nginx容器在监听流量(并使用从主机地址上的44380到其自身地址上的44380的端口转发),所以你必须将curl命令指向nginx容器的地址。它对nginx容器有效,因为在该容器的上下文中,localhost指向它自己。
顺便说一句,我在试图弄清楚将健康检查放在flask容器、nginx容器或两者上是否是最佳实践时遇到了这个问题。

相关问题