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