在 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
相关推荐
长天一色15 分钟前
【ECMAScript 从入门到进阶教程】第三部分:高级主题(高级函数与范式,元编程,正则表达式,性能优化)
服务器·开发语言·前端·javascript·性能优化·ecmascript
NiNg_1_23432 分钟前
npm、yarn、pnpm之间的区别
前端·npm·node.js
秋殇与星河35 分钟前
CSS总结
前端·css
BigYe程普1 小时前
我开发了一个出海全栈SaaS工具,还写了一套全栈开发教程
开发语言·前端·chrome·chatgpt·reactjs·个人开发
大道归简1 小时前
Docker 命令从入门到入门:从 Windows 到容器的完美类比
windows·docker·容器
余生H1 小时前
前端的全栈混合之路Meteor篇:关于前后端分离及与各框架的对比
前端·javascript·node.js·全栈
程序员-珍1 小时前
使用openapi生成前端请求文件报错 ‘Token “Integer“ does not exist.‘
java·前端·spring boot·后端·restful·个人开发
axihaihai1 小时前
网站开发的发展(后端路由/前后端分离/前端路由)
前端
流烟默2 小时前
Vue中watch监听属性的一些应用总结
前端·javascript·vue.js·watch
zeruns8022 小时前
如何搭建自己的域名邮箱服务器?Poste.io邮箱服务器搭建教程,Linux+Docker搭建邮件服务器的教程
linux·运维·服务器·docker·网站