如何在Docker镜像中同时运行两个含无限循环的Python脚本?
解决Docker中同时运行两个长期运行Python脚本的问题
问题根源
Dockerfile里的CMD指令只会执行最后一条,前面的会被自动覆盖,这就是你当前只有第二个脚本生效的原因。
可选解决方案
1. 使用Shell脚本启动多进程
写一个启动脚本,让第一个脚本后台运行,第二个脚本前台运行(保证容器不会因为进程退出而停止):
- 在项目根目录创建
start.sh文件:
#!/bin/bash # 后台运行第一个脚本 python3 main.py btcusdt & # 前台运行第二个脚本,维持容器存活 python3 Flask_API/api_main.py
- 修改Dockerfile,添加脚本执行权限并指定启动命令:
FROM python:3.8 COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY . . # 给启动脚本添加执行权限 RUN chmod +x start.sh # 执行启动脚本 CMD ["./start.sh"]
2. 使用进程管理工具(如supervisord)
用supervisord统一管理多个进程,适合需要运行多个长期服务的场景:
- 修改Dockerfile,安装supervisord并配置启动:
FROM python:3.8 COPY requirements.txt requirements.txt RUN pip install -r requirements.txt # 安装supervisord RUN apt-get update && apt-get install -y supervisor COPY . . # 创建日志目录 RUN mkdir -p /var/log/supervisor # 复制supervisor配置文件(需提前创建) COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf # 启动supervisord CMD ["/usr/bin/supervisord"]
- 创建
supervisord.conf配置文件,定义两个进程:
[supervisord] nodaemon=true [program:main-script] command=python3 main.py btcusdt stdout_logfile=/var/log/supervisor/main.log stderr_logfile=/var/log/supervisor/main.err.log autorestart=true [program:flask-api] command=python3 Flask_API/api_main.py stdout_logfile=/var/log/supervisor/flask-api.log stderr_logfile=/var/log/supervisor/flask-api.err.log autorestart=true
3. 拆分两个独立Docker镜像(推荐最佳实践)
如果两个脚本是独立的服务,拆分镜像更符合Docker的单进程设计原则,后续维护、扩展和日志管理都会更方便:
- 为
main.py创建单独的Dockerfile.main:
FROM python:3.8 COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY main.py . CMD ["python3", "main.py", "btcusdt"]
- 为Flask API创建
Dockerfile.api:
FROM python:3.8 COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY Flask_API/ ./Flask_API/ CMD ["python3", "Flask_API/api_main.py"]
- 分别构建两个镜像并独立运行即可。
内容的提问来源于stack exchange,提问作者Selman
相关产品推荐
相关产品推荐

