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

Celery配置正确但无法按计划启动定时任务求助

Celery定时任务时区不生效问题排查与解决(Alpine Docker环境)

问题背景

Django项目中已配置Celery时区相关参数:

  • settings.py代码:
    CELERY_ENABLE_UTC = False
    CELERY_TIMEZONE = 'Asia/Omsk'
    
  • celery.py代码:
    # -*- coding: utf-8 -*-
    from __future__ import absolute_import
    import os
    
    from celery import Celery
    from celery.schedules import crontab
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sendings.settings')
    
    app = Celery('sendings')
    app.config_from_object('django.conf:settings', namespace='CELERY')
    app.autodiscover_tasks()
    
    app.conf.beat_schedule = {
        'sending_to_emails': {
            'task': 'app.tasks.sendings',
            'schedule': crontab(minute=36, hour=22)
        },
    }
    

基于Alpine镜像的Docker容器系统时间与Asia/Omsk时区一致,但Celery定时任务未按预期时间执行,重启容器后问题依旧。

解决步骤

1. 安装Alpine时区依赖

Alpine镜像默认不包含完整的tzdata数据库,即便系统时间显示正常,Python也无法正确解析时区。在Dockerfile中添加以下配置:

RUN apk add --no-cache tzdata
ENV TZ=Asia/Omsk

重新构建镜像并启动容器。

2. 验证Celery时区加载状态

启动Celery Beat时开启日志,确认时区配置是否被正确加载:

celery -A sendings beat -l info

检查日志中是否存在Timezone set to 'Asia/Omsk'的输出,确保配置生效。

3. 清除Beat调度缓存

旧的调度缓存可能导致新时区设置不生效,可删除默认的调度文件celerybeat-schedule,或启动时指定新的调度文件:

celery -A sendings beat -l info --schedule=/tmp/celerybeat-schedule

4. 排查配置覆盖问题

确认celery.py中app.config_from_object语句之后,没有出现覆盖时区设置的代码,保证settings中的配置优先级最高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:12:35