Django Crontab 任务在 Docker 容器内未执行

3
我在Docker容器中运行Django crontab作业时遇到了问题。这些crontab作业在我的本地开发环境中完美运行,但是当我将我的Django应用程序docker化并尝试在容器中运行时,这些crontab作业似乎无法按预期执行。
以下是设置和我遇到的问题的详细说明:
1. 本地开发(正常工作): 在我的本地开发环境中,我已经在Django设置中添加了以下配置:
THIRD_PARTY_APPS = [
    "django_crontab",
]

CRONJOBS = [
    ("* * * * *", "apps.{path}.jobs.deactivate_expired_enrollments"),
]

这个配置设置了一个定时任务,用于取消过期的课程注册。这个定时任务在当前环境中运行得非常完美。
2. Docker 配置: 为了将我的 Django 应用程序容器化,我创建了一个 Dockerfile 和一个 start.sh 脚本,作为我的 Docker Compose 配置的一部分:
Dockerfile:
# Install apt packages
RUN apt-get update && apt-get install --no-install-recommends -y \
    # Installing cron
    cron \

RUN touch /var/log/cron.log

RUN (crontab -l ; echo "* * * * * echo 'Hello world' >> /var/log/cron.log") | crontab

# Run the command on container startup
CMD cron && tail -f /var/log/cron.log

start.sh:

#!/bin/bash

set -o errexit
set -o pipefail
set -o nounset

python manage.py migrate
python manage.py crontab add
python manage.py runserver 0.0.0.0:8000

# crontab -l
* * * * * echo Hello world >> /var/log/cron.log
* * * * * /usr/local/bin/python /app/manage.py crontab run b428252730534a0b85d6be057a9debe1 # django-cronjobs for config

问题: 在设置好Docker环境并在容器中运行我的Django应用程序之后,当我运行python manage.py crontab show时,可以正确注册crontab作业。然而,该作业并未按预期执行。尽管该作业显示为活动状态,但它不会按指定的间隔运行。命令python manage.py crontab run {cron_id}只会执行该作业一次,但它不会像应该那样自动运行。
我已检查了各个方面,例如Docker设置、配置crontab作业的方式以及Docker与crontab服务之间的交互。一切似乎都是正确的,我也没有收到任何可能指导我进行调试的错误消息。
我希望能够获得帮助,理解为什么crontab作业在Docker容器内未按预期运行。如果有人在Docker化环境中运行Django crontab作业方面有经验,并且可以提供关于潜在问题、配置调整或故障排除步骤的见解,我将非常感激。
谢谢您的时间和帮助。
为了解决Docker容器中crontab作业无法运行的问题,我在start.sh脚本中添加了service cron start命令。我的意图是在容器内手动启动cron服务,希望这样可以触发crontab作业的执行。 但是并没有起作用。

请提供 "docker inspect yourcontainer" 命令的输出。 - Richard Rublev
1
我认为你应该运行两个容器,一个用于你的应用程序,另一个用于定时任务。 - Richard Rublev
1个回答

0
问题可能是因为您的Docker容器缺少一些django-crontab所需的依赖项,导致该库在无服务器环境中几乎无法使用。其中一个依赖项可能是类似于systemd的东西。在您的情况(无服务器环境)下,可以考虑使用类似django-serverless-cron的替代方案来解决问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接