在 docker 中启动 supervisor 来监控flask web程序,实现停机自动拉起

在 docker 中启动 supervisor 来监控flask web程序,实现停机自动拉起

目录结构

shell 复制代码
- src
	- supervisor
    -conf.d
	    api_test.ini
  	supervisord.conf
  __init__.py
  Dockerfile
  main.py
  

web 程序

可以是 flask、fastapi 等,这里只是示例

python 复制代码
# import os
# import signal
# import sys
import time

#
# from fastapi import FastAPI, Query
#
# app = FastAPI()
#
#
# @app.get("/index")
# def query_list():
#     print("index1111", 11111)
#     return {"index": time.time()}
#
#
# @app.get("/home")
# def query_list():
#     time.sleep(1)
#     print("home")
#
#     # os.kill(os.getpid(), signal.SIGKILL)
#
#     return {"home": f"home-{time.time()}"}
#
#
# if __name__ == "__main__":
#     import uvicorn
#
#     uvicorn.run("main:app", host="0.0.0.0", port=8001, reload=True)


from flask import Flask

app = Flask(__name__)


@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"


@app.route("/index")
def query_list():
    print("index1111", 11111)
    return {"index": time.time()}


@app.get("/home")
def query_list1():
    time.sleep(1)
    print("home")

    # os.kill(os.getpid(), signal.SIGKILL)

    return {"home": f"home-{time.time()}"}


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, debug=True)

Dockerfile 文件

这里用于构建应用程序与 supervisor运行docker

dockerfile 复制代码
FROM python:3.10

# 用 root 用户操作
USER root

RUN apt-get clean
RUN apt-get update

# 安装 supervisor
RUN apt-get install -y supervisor
RUN apt-get install -y vim

# RUN pip install --no-cache-dir --upgrade --timeout 10000 fastapi uvicorn
RUN pip install --no-cache-dir --upgrade --timeout 10000 flask

WORKDIR /app

COPY . /app
# supervisor 设置配置文件
COPY ./supervisor /etc/supervisor

# supervisor 设置日志
RUN mkdir -p /var/log/supervisor
RUN ["chmod", "-R", "777", "/var/log/supervisor"]

EXPOSE 8000

RUN groupadd -r imuser && useradd -r -g imuser imuser
USER imuser

#CMD ["python", "main.py"]
CMD ["supervisord", "-n", "-c", "/etc/supervisor/supervisord.conf"]

supervisord.conf

这里是 supervisor 的配置文件

conf 复制代码
[unix_http_server]
file=/tmp/supervisor.sock ;UNIX socket 文件,supervisorctl 会使用

[inet_http_server]         ; inet (TCP) server disabled by default
port=*:9001        ; ip_address:port specifier, *:port for all iface
username=user              ; default is no username (open server)
password=123               ; default is no password (open server)

[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
logfile_maxbytes=50MB  ;日志文件大小,超出会rotate,默认 50MB,如果设成0,表示不限制大小
logfile_backups=10   ;日志文件保留备份数量默认10,设为0表示不备份
loglevel=info    ;日志级别,默认info,其它: debug,warn,trace
nodaemon=false    ;是否在前台启动,默认是false,即以 daemon 的方式启动
minfds=1024     ;可以打开的文件描述符的最小值,默认 1024
minprocs=200     ;可以打开的进程数的最小值,默认 200


[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致
;serverurl=http://127.0.0.1:9001 ; 通过HTTP的方式连接supervisord


[include]
files = /etc/supervisor/conf.d/*.ini

api_test.ini

ini 复制代码
[program:blog]
#脚本目录
directory=/app
#脚本执行命令
command=python3 /app/main.py
# 这里可以配置启动的环境变量
;environment=PROJECT_ENV=onlie
#supervisor启动的时候是否随着同时启动,默认True
autostart=true
#当程序exit的时候,这个program不会自动重启,默认unexpected,设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected和 true。如果为false的时候,无论什么情况下,都不会被重新启动,如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的
autorestart=true
#这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了。默认值为1
startsecs=1
#脚本运行的用户身份
user = imuser
#日志输出
stderr_logfile=/var/log/supervisor/api_stderr.log
stdout_logfile=/var/log/supervisor/api_stdout.log
#把stderr重定向到stdout,默认 false
;redirect_stderr = true
#stdout日志文件大小,默认 50MB
stdout_logfile_maxbytes = 20
#stdout日志文件备份数
stdout_logfile_backups = 20

启动使用

shell 复制代码
# 构建镜像
docker build -t test_app:latest .

# 启动容器
docker run -d --name test_run -p 8000:8000 -p 9001:9001 test_app:latest


# 以下没用,只是记录
docker exec -u root -it test_run bash
docker exec -it test_run bash
supervisord -c /etc/supervisor/supervisord.conf
docker rm -f test_run
docker restart test_run
相关推荐
浩~~几秒前
CSS常用选择器
前端·css
于慨6 分钟前
uniapp+vite+cli模板引入tailwindcss
前端·uni-app
yunvwugua__21 分钟前
Python训练营打卡 Day26
前端·javascript·python
东方未明010824 分钟前
docker(四)使用篇一:docker 镜像仓库
docker·容器·镜像仓库
满怀101529 分钟前
【Django全栈开发实战】从零构建企业级Web应用
前端·python·django·orm·web开发·前后端分离
Darling02zjh1 小时前
GUI图形化演示
前端
Channing Lewis1 小时前
如何判断一个网站后端是用什么语言写的
前端·数据库·python
互联网搬砖老肖1 小时前
Web 架构之状态码全解
前端·架构
showmethetime1 小时前
matlab提取脑电数据的五种频域特征指标数值
前端·人工智能·matlab
ChironW2 小时前
Ubuntu 22.04.5 LTS上部署Docker及相关优化
ubuntu·docker·容器