Supervisor 守护服务

配置服务

cat /etc/supervisor/conf.d/supervisord.conf

起停服务

docker exec -it my-worker bash
vi /etc/supervisor/conf.d/supervisord.conf


supervisorctl status
supervisorctl reload  #需要配置rpc才能使用
重启docker服务

添加环境

apt install  python3-pip   python3-virtualenv  
cd /app  #应用主目录
virtualenv myenv  #本质是创建一个目录并需要的文件放到里面
source myenv/bin/activate  #使用环境
deactivate  #退出环境

标准服务

# ---------------------------------------------------
# 示例程序配置
# ---------------------------------------------------
[program:hr-rpc]
command=/app/myenv/bin/python3 /app/subservice/hr-rpc.py
directory=/app/subservice         
user=root                    
autostart=true
autorestart=true
startsecs=5
startretries=3
redirect_stderr=true
stdout_logfile=/var/log/supervisor/hr-rpc.log
stdout_logfile_maxbytes=5MB
stdout_logfile_backups=10
environment=PYTHONUNBUFFERED="1"   

添加jsonapi

目录映射 所以代码都在/app/subservice之下

virtualenv pyenv_json-db-api
source pyenv_json-db-api/bin/activate
pip3 install tornado sqlalchemy pymssql


deactivate  #退出环境

[program:json-db-api]
command=/app/pyenv_json-db-api/bin/python3 web.py
directory=/app/subservice/jsonapi 
user=root                    
autostart=true
autorestart=true
startsecs=5
startretries=3
redirect_stderr=true
stdout_logfile=/var/log/supervisor/json-db-api.log
stdout_logfile_maxbytes=5MB
stdout_logfile_backups=10
environment=PYTHONUNBUFFERED="1"   

添加小屏报表

安装依赖

cd /app 
virtualenv pyenv_json-db-api
source pyenv_json-db-api/bin/activate
pip3 install matplotlib
apt install fonts-wqy-microhei
[program:json-db-api]
command=/app/pyenv_json-db-api/bin/python3 day_info.py
directory=/app/subservice/day-info
user=root                    
autostart=true
autorestart=true
startsecs=5
startretries=3
redirect_stderr=true
stdout_logfile=/var/log/supervisor/day-info.log
stdout_logfile_maxbytes=5MB
stdout_logfile_backups=10
environment=PYTHONUNBUFFERED="1"   

opencode

[program:open-code]
command=/usr/local/bin/opencode serve --hostname 0.0.0.0 --port 4090
directory=/app
user=root
autostart=true
autorestart=true
startsecs=5
startretries=3
redirect_stderr=true
stdout_logfile=/var/log/supervisor/opencode.log
stdout_logfile_maxbytes=5MB
stdout_logfile_backups=10
environment=OPENCODE_SERVER_PASSWORD=""

安装服务

Supervisor

mkdir supervisor
cd supervisor

创建配置文件

配置文件 vi supervisord.conf

[supervisord]
# 必须设置为 true,确保 Supervisor 保持在前台,不 fork
nodaemon=true
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid
[unix_http_server]
file=/var/run/supervisor.sock  
chmod=0770  
[inet_http_server]
# Web 管理界面监听的 IP 地址和端口
port=0.0.0.0:9099
username=admin       
password=sub100200300         
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
 

vi Dockerfile

# ----------------------------------------------------
# Dockerfile:基于 Debian 12 (Bookworm) 的 Supervisor 容器
# ----------------------------------------------------

# 1. 选择最轻量级的 Debian 12 基础镜像
FROM debian:12-slim

# 设定工作目录
WORKDIR /app

# 2. 安装 Supervisor 及其运行时依赖
# 使用一个 RUN 命令链式安装和清理,以减少镜像层数和体积。
RUN apt-get update \
    # 使用 --no-install-recommends 避免安装非必需的软件包,保持最小化
    && apt-get install -y --no-install-recommends supervisor procps iproute2
 curl \
    \
    # 假设你的应用是 Python 写的,需要运行环境
    # && apt-get install -y --no-install-recommends python3 python3-pip \
    \
    # 关键步骤:清理软件包缓存和临时文件,以减小最终镜像体积
    && rm -rf /var/lib/apt/lists/* \
    && apt-get clean

# 3. 复制应用代码和 Supervisor 配置
# 假设 supervisord.conf 和应用文件(例如 worker.py)在 Dockerfile 同级目录
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
#COPY worker.py /app/worker.py

# 4. 设置容器启动配置 (核心)
# 确保 Supervisor 以非守护进程 (-n) 模式运行,成为容器的 PID 1 进程,
# 这样容器的 SIGTERM 信号能被正确捕获,实现优雅关闭。
ENTRYPOINT ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

# 可选:如果开启了 Web 界面 (9001 端口),需要暴露该端口
# EXPOSE 9001

构建

docker build -t my-supervisor-image .
docker run -d --name my-worker --network host my-supervisor-image -v /opt/docker/subservice:/app/subservice
docker exec -it my-worker bash

docker exec -it opencodex bash

运行

方便调整 subservice.yaml

version: '3.3'

services:
  # 服务名称,在 Compose 中通常作为容器名称的前缀
  my-worker:
    # 指定要使用的 Docker 镜像
    image: my-supervisor-image
    
    # 显式设置容器名称,以匹配原命令中的 --name my-worker
    container_name: my-worker
    
    # 设置网络模式为 host,这样容器将共享宿主机的网络命名空间
    network_mode: host
    
    # 卷挂载配置:<宿主机路径>:<容器内路径>
    volumes:
      - ./app/:/app/
      - ./conf.d/:/etc/supervisor/conf.d/
      
    # 推荐为后台工作进程(worker)设置重启策略
    restart: always

docker-compose  -f ./subservice.yaml  up -d