Docker环境下配置Celery Beat后定时任务不执行问题求助
核心问题排查(优先级从高到低)
路径不匹配问题
你docker-compose配置中,celery、celery-beat服务的挂载路径是./:/code,而app服务的挂载路径是./:/usr/src/app。如果你的项目Dockerfile中指定的WORKDIR为/usr/src/app,那么celery服务启动时,工作目录下没有对应项目代码,无法找到config模块,直接启动失败,自然不会输出任务日志也不会执行任务。
修复方案:统一celery相关服务的挂载路径和工作目录,修改docker-compose.yml中celery、celery-beat服务的volumes配置为:
volumes: - ./:/usr/src/app
同时可显式指定工作目录,添加working_dir: /usr/src/app配置项。
环境变量缺失问题
你的celery、celery-beat服务配置中没有指定env_file,无法读取.env中的环境变量。如果你的CELERY_BROKER_URL没有硬编码在settings.py中,而是依赖环境变量读取,那么celery服务无法连接到redis broker,导致任务无法调度和执行。
修复方案:在celery、celery-beat服务配置中添加env_file配置:
env_file: - ./.env
日志单独排查
默认docker-compose up会混合输出所有服务的日志,celery的报错可能被其他服务日志覆盖,单独查看对应服务日志确认报错信息:
# 查看celery worker日志 docker-compose logs celery # 查看celery beat日志 docker-compose logs celery-beat
配置加载验证
确认项目根目录config/__init__.py中已导出celery实例,保证celery启动时能正确加载配置:
from .celery import app as celery_app __all__ = ('celery_app',)
任务有效性验证
手动触发定时任务验证任务本身可正常执行:
# 进入celery容器 docker-compose exec celery bash # 手动调用任务 celery -A config call gamehub.tasks.pull_games
如果执行报错,按报错信息修复任务逻辑即可。
时区一致性验证
虽然不会导致任务完全不执行,但需要保证容器时区、Celery配置时区、Django配置时区一致,避免任务执行时间不符合预期。
内容的提问来源于stack exchange,提问作者peter ignatiev

