You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Docker中同时运行FastAPI与Cron定时任务

如何在Docker容器中同时运行FastAPI和Cron任务

问题根源

你的Dockerfile中写了两个CMD指令,但Docker容器只会执行最后一条CMD,所以当前容器仅会启动Cron服务,FastAPI并不会运行。要同时启动两个进程,需要将它们整合到同一个启动流程中。

解决方案一:使用启动脚本(最简单方案)

  1. 在项目根目录创建start.sh启动脚本,内容如下:
#!/bin/bash

# 后台启动Cron服务
cron -f &

# 前台启动FastAPI服务(生产环境建议移除--reload)
uvicorn main:app --host 0.0.0.0 --port 8000
  1. 修改Dockerfile,替换原有两个CMD指令:
# 给启动脚本添加执行权限
RUN chmod +x start.sh

# 执行启动脚本
CMD ["./start.sh"]

解决方案二:使用Supervisord(规范的进程管理)

如果需要对进程进行监控(比如进程崩溃后自动重启),可以用Supervisord作为进程管理工具:

  1. 在项目根目录创建supervisord.conf配置文件:
[supervisord]
nodaemon=true

[program:cron]
command=cron -f
autostart=true
autorestart=true

[program:fastapi]
command=uvicorn main:app --host 0.0.0.0 --port 8000
autostart=true
autorestart=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
  1. 修改Dockerfile,安装Supervisord并替换启动指令:
    在pip install -r requirements.txt后添加:
RUN pip install supervisor

然后替换原有两个CMD为:

CMD ["supervisord", "-c", "supervisord.conf"]

额外注意事项

  • 生产环境中不要使用--reload参数,该参数仅适用于本地开发热重载场景。
  • 确保你的crontab配置正确,可在启动脚本中添加crontab -l命令验证配置是否生效。
  • 若Cron任务需要调用FastAPI内部逻辑,优先通过函数直接调用而非HTTP请求,避免网络开销。

内容的提问来源于stack exchange,提问作者siam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 13:45:24