【小白包会的】使用supervisor 管理docker内多进程
使用supervisor 管理docker内多进程
一般情况下,一个docker是仅仅运行一个服务的
但是有的情况中,希望一个docker中运行多个进程,运行多个服务,也就是一个docker容器执行多个服务。
调研了一下,发现可以通过**supervisor ** 实现,综合对比下来,上手难度和配置相对来说还算简单
总的来说需要在单体服务的基础上做以下操作
- 编写
supervisord.conf配置文件 - 修改dockerfile文件,包括:下载supervisor, 修改docker入口
举例使用
下面来举例说明supervisor的简单使用:
比如下面的一个目录文件夹:

包含两个py文件,模拟两个不同的服务,一个服务process1 执行一个循环的进程(这里只是示例,可以是别的什么服务)
# process1.pyfrom multiprocessing import current_process
import time
import logginglogging.basicConfig(level=logging.INFO)
logger = logging.getLogger()def process1():while True:logger.info(f"i am process 1, in process {current_process().pid}")time.sleep(1)if __name__ == "__main__":process1()
process2 来运行一个fasapi服务,服务监听8096端口
import logging
import uvicornfrom typing import Unionfrom fastapi import FastAPIapp = FastAPI()@app.get("/")
def read_root():return {"Hello": "World"}@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):return {"item_id": item_id, "q": q}if __name__ == "__main__":uvicorn.run(app='run:app', port=8096, host="0.0.0.0")
现在我们有两个进程process1和process2需要在一个docker中运行,我们来看dockerfile实现:
FROM python:3.9-slim AS builderWORKDIR /app
# 这里将apt源修改为国内源,可选,如果有自己的配置,用自己的
COPY ./sources.list /etc/apt/RUN apt-get update \&& apt-get upgrade -y\&& apt-get install -y --no-install-recommends build-essential# 下载python包
COPY ./requirements.txt .
RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt# 实际运行阶段
FROM python:3.9-slimWORKDIR /appCOPY --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages
COPY --from=builder /usr/local/bin/uvicorn /usr/local/bin/uvicornCOPY . .COPY ./sources.list /etc/apt/sources.list
# RUN cat /etc/apt/sources.list
# 安装 supervisor 和其他系统工具
RUN apt-get update && apt-get install -y --no-install-recommends supervisor \# 创建 supervisor 配置文件夹&& mkdir -p /etc/supervisor/conf.dEXPOSE 8096# 将 supervisor 配置文件复制到容器中
COPY ./supervisord.conf /etc/supervisor/conf.d/supervisord.conf# 启动命令
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
可见相对于单体进程,实际上只是添加和修改了下面这部分
# 安装 supervisor 和其他系统工具
RUN apt-get update && apt-get install -y --no-install-recommends supervisor \# && rm -rf /var/lib/apt/lists/* \&& mkdir -p /etc/supervisor/conf.d# # 创建 supervisor 配置文件夹
# RUN mkdir -p /etc/supervisor/conf.dEXPOSE 8096# 将 supervisor 配置文件复制到容器中
COPY ./supervisord.conf /etc/supervisor/conf.d/supervisord.conf# 启动命令
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
最后# 启动命令 CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
需要根据我们创建的supervisord.conf 启动进程
来看supervisord.conf 的编写:
# supervisord 的配置
[supervisord]
nodaemon=true # 是否为守护进程
pidfile=/var/run/supervisord.pid
logfile=/var/log/supervisor/supervisord.log # supervisord.log的日志,可以看各个进程启动运行情况# 第一个进程 [program:{进程名}]
[program:process1]
command=python /app/process1.py # 启动命令 注意这里应该使用绝对路劲
autostart=true # 是否自动启动,设为true
autorestart=true # 是否自动重启
stderr_logfile=/var/log/supervisor/process1.err.log # log日志
stdout_logfile=/var/log/supervisor/process1.out.log[program:fastapi-process]
command=/usr/local/bin/uvicorn --host 0.0.0.0 --port 8096 process2:app # 启动命令uvicorn
autostart=true
autorestart=true
stderr_logfile=/var/log/supervisor/fastapi-process.err.log
stdout_logfile=/var/log/supervisor/fastapi-process.out.log
而后我们构建该镜像
docker build -t test_supervisor . 构建镜像
启动容器:
docker run -d -p 8096:8096 --name test_supervisor test_supervisor
但是这里查看两个进程的日志需要进到容器里面才行:
可见在容器中的/var/log/supervisor 中创建了几个日志文件正好是我们在supervisord.conf 中配置的文件

# 先进入容器 docker exec -it test_supervisor bash# 查看supervisor各进程启动情况
tail -f /var/log/supervisor/supervisord.log# 查看process1 的log输出日志
tail -f /var/log/supervisor/process1.err.log
#以此类推
相关文章:
【小白包会的】使用supervisor 管理docker内多进程
使用supervisor 管理docker内多进程 一般情况下,一个docker是仅仅运行一个服务的 但是有的情况中,希望一个docker中运行多个进程,运行多个服务,也就是一个docker容器执行多个服务。 调研了一下,发现可以通过**super…...
使用navicat新旧版本,连接PostgreSQL高版本报错问题图文解决办法
使用navicat新旧版本,连接PostgreSQL高版本报错问题图文解决办法 一、问题现象:二、出现原因三、解决方法:1、升级Navicat版本:2、使用低版本的postgreSQL:3、修改Navicat的dll二进制文件:navicat版本15nav…...
IDEA 未启用lombok插件的Bug
项目中maven已引用了lombok依赖,之前运行没有问题的,但有时启动会提示: java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled. Your processor is: com.sun.proxy.$Proxy8 Lombok support…...
认识GO--gRPC的metadata
参考: 写给go开发者的gRPC教程-metadata-CSDN博客https://blog.csdn.net/kevin_tech/article/details/129395177?ops_request_misc%257B%2522request%255Fid%2522%253A%25221f2f2e26f48c755c33344ccb171a49fc%2522%252C%2522scm%2522%253A%252220140713.130102334…...
2024年安徽省职业院校技能大赛信息安全管理与评估
一、赛项名称 赛项名称:信息安全管理与评估 英文名称:Information Security Management and Evaluation 赛项组别:高职组 赛项归属:电子信息大类 二、竞赛目标 通过赛项检验参赛选手熟悉信息安全行业标准规范和信息 安全测试员新职…...
Perl 引用
Perl 引用 Perl,作为一种灵活而强大的编程语言,广泛用于系统管理、网络编程、GUI开发等领域。在Perl编程中,引用(References)是一个核心概念,它允许变量引用其他数据,从而创建复杂的数据结构&a…...
RT-Thread启动过程 :从汇编开始的启动流程
这个系列参考了《嵌入式实时操作系统RT-Thread设计与实现》,会详细介绍RT-Thread的启动流程,即是如何从零开始在开发板上运行起一个RTOS内核的。本文将会以 ch32v307VCT6 开发板为例展开进行详细介绍。主要包括:startup.S、初始化与系统相关的…...
Scala—“==“和“equals“用法(附与Java对比)
Scala 字符串比较—""和"equals"用法 Scala 的 在 Scala 中, 是一个方法调用,实际上等价于调用 equals 方法。不仅适用于字符串,还可以用于任何类型,并且自动处理 null。 Demo: Java 的 在 J…...
$route和$router的区别
在 Vue.js 中,$route 和 $router 都是 Vue Router 提供的对象,但它们有不同的用途和功能。 1. $router $router 是 Vue Router 实例的引用,它允许你通过 JavaScript 进行路由的控制和导航。你可以通过 $router 来执行路由的操作,…...
[工具升级问题] 钉钉(linux版)升级带来的小麻烦
本文由Markdown语法编辑器编辑完成。 1. 背景: 今日钉钉又发布了新的升级版本。由于我工作时使用的是Ubuntu 20.04版本,收到的升级推送信息是,可以升级到最新的7.6.25-Release版本。根据钉钉官方给出的历次更新版说明,这个新的版本…...
Leetcode经典题13--接雨水
题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 输入输出示例 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1…...
yarn修改缓存位置
查看缓存位置 以下三个命令分别为:bin是yarn存储命令的二进制文件,global存储全局node_modules ,cache存储用下下载缓存,查看本机目前的目录: 查看bin目录命令:yarn global bin 查看global目录命令&…...
OpenHarmony-3.HDF input子系统(5)
HDF input 子系统OpenHarmony-4.0-Release 1.Input 概述 输入设备是用户与计算机系统进行人机交互的主要装置之一,是用户与计算机或者其他设备通信的桥梁。常见的输入设备有键盘、鼠标、游戏杆、触摸屏等。本文档将介绍基于 HDF_Input 模型的触摸屏器件 IC 为 GT91…...
RabbitMQ 消息持久化/镜像队列/lazy对时延影响
测试背景: 不同条件下RabbitMQ不同队列类型的生产时延测试: 测试环境: 机型:rabbimtq.2u4g.cluster 背景流量:1000 TPS 测试条件: 消息大小 4k,消息条数为1000条,时延取值为平均…...
【深度学习】深刻理解Swin Transformer
Swin Transformer 是一种基于 Transformer 的视觉模型,由 Microsoft 研究团队提出,旨在解决传统 Transformer 模型在计算机视觉任务中的高计算复杂度问题。其全称是 Shifted Window Transformer,通过引入分层架构和滑动窗口机制,S…...
[2015~2024]SmartMediaKit音视频直播技术演进之路
技术背景 2015年,因应急指挥项目需求,我们实现了RTMP推送音视频采集推送(采集摄像头和麦克风数据)模块,在我们做好了RTMP推送模块后,苦于没有一个满足我们毫秒级延迟诉求的RTMP播放器,于是第一…...
redis 使用Lettuce 当redis挂掉重启之后 网络是怎么重新连接
Lettuce是一个高性能的Java Redis客户端,支持同步、异步和反应式编程模式 Lettuce的核心功能包括: 高性能:通过使用Netty作为底层网络通信框架,实现了非阻塞IO,提高了性能。丰富的API:提供了丰富…...
【IntelliJ IDEA 集成工具】TalkX - AI编程助手
前言 在数字化时代,技术的迅猛发展给软件开发者带来了更多的挑战和机遇。为了提高技术开发群体在繁多项目中的编码效率和质量,他们需要一个强大而专业的工具来辅助开发过程,而正是为了满足这一需求,TalkX 应运而生。 一、概述 1…...
二叉搜索树Ⅲ【东北大学oj数据结构8-3】C++
二叉搜索树 III B:在二叉搜索树II中加入delete指令,创建程序对二叉搜索树T执行如下指令。 插入 k:将key k 插入到 T 中。 find k:报告T中是否存在key k。 delete k:删除key为 k 的节点。 打印:使用中序树遍…...
【面试笔记】CPU 缓存机制
CPU 缓存机制 1. CPU Cache 与 MMU1.1 MMU 是什么?TLB 又是什么?他们是怎么工作的?2.2 简述 Cache 与 MMU 的协作关系?2.3 简述 Cache 与 MMU 的协作工作流程? 2. CPU 多层次缓存2.1 什么是 CPU 的多层次缓存结构&…...
手把手教你用AT32F403A实现串口空闲中断接收完整数据帧
深入解析AT32F403A串口空闲中断实现高效数据帧接收 在嵌入式系统开发中,串口通信是最基础也最常用的外设接口之一。面对实际应用中常见的不定长数据帧接收需求,传统轮询方式不仅效率低下,还容易丢失数据。而国产MCU雅特力AT32F403A提供的**串…...
手把手教你用n8n和Gemini 2.5 Flash搭建英语作文批改机器人(附完整工作流JSON)
从零构建AI英语作文批改系统:基于n8n与Gemini的自动化实践 在数字化教育浪潮中,教师面临的最大挑战之一是如何高效处理大量学生作业。英语作文批改尤其耗时——需要逐字阅读、语法检查、内容评估,最后还要给出建设性反馈。传统方式下…...
从外卖配送到大疆无人机:经纬度距离计算在真实业务场景中的5种应用实践
经纬度计算在商业场景中的实战应用:从路径优化到智能决策 当你在手机上下单一份外卖,15分钟后热腾腾的餐食准时送达;当无人机精准降落在指定位置,完成最后一公里配送;当共享单车APP为你推荐最优停车点——这些场景背后…...
SM4算法在嵌入式平台的轻量化移植与优化实践
1. SM4算法与嵌入式平台适配挑战 SM4作为我国自主设计的商用分组密码标准,在物联网设备安全领域应用广泛。但直接将OpenSSL中的SM4实现移植到STM32等嵌入式平台时,开发者常会遇到三大难题: 代码体积膨胀:OpenSSL的SM4实现依赖大量…...
张量维度操控心法:从reshape到升维降维,吃透PyTorch形状操作的底层逻辑
✨ 张量维度操控心法:从reshape到升维降维,吃透PyTorch形状操作的底层逻辑🔐 张量形状操作的黄金法则:形状是视角,内容是本质🔧 reshape函数:零侵入的形状重塑神器核心原理与执行规则实操代码与…...
数据库课程设计好帮手:Phi-4-mini-reasoning辅助ER图设计与SQL优化
数据库课程设计好帮手:Phi-4-mini-reasoning辅助ER图设计与SQL优化 1. 课程设计的痛点与解决方案 每到学期末,计算机专业的学生们都会面临一个共同的挑战——数据库课程设计。这个需要完成ER图设计、SQL编写和文档撰写的综合项目,常常让初学…...
webMAN-MOD终极指南:如何在PS3上安装这款强大的全能插件
webMAN-MOD终极指南:如何在PS3上安装这款强大的全能插件 【免费下载链接】webMAN-MOD Extended services for PS3 console (web server, ftp server, netiso, ntfs, ps3mapi, etc.) 项目地址: https://gitcode.com/gh_mirrors/we/webMAN-MOD 你是否还在为PS3…...
南北阁模型新玩法:一键部署极简WebUI,体验手机短信般AI对话
南北阁模型新玩法:一键部署极简WebUI,体验手机短信般AI对话 还在用那些界面老旧、反应迟钝的AI对话工具吗?每次发送问题后,只能盯着屏幕上的加载图标干等,几秒甚至十几秒后才能看到一大段文字“啪”地一下弹出来&…...
OpenCore Legacy Patcher实用指南:让老旧Mac焕发新生
OpenCore Legacy Patcher实用指南:让老旧Mac焕发新生 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 随着苹果不断推进macOS系统更新,…...
告别图形界面!用DM数据库的dlsql命令行工具,5分钟搞定日常数据库运维
命令行利器dlsql:DM数据库高效运维实战指南 在数据库运维的世界里,图形化界面固然直观,但真正的高手往往更青睐命令行工具带来的高效与灵活。DM数据库的dlsql命令行客户端,就是这样一把被许多DBA私藏的"瑞士军刀"。 1. …...
