django_crontab 无法在生产 docker 上工作

问题描述 投票:0回答:5

我正在尝试使用 django_crontab 每天运行两次计划脚本。我在ubuntu 18上本地测试过,可以用。但是,当我尝试在服务器上运行它(在远程 Ubuntu 服务器上运行 Django 项目的 python Docker 映像)时,什么也没有发生。 这是我的代码:

setting.py

INSTALLED_APPS = (
.
.
    'django_crontab',
.
.
.
)

RONJOBS = [
    ('0 9,21 * * *', 'appname.folder.file.start')
]

我通过以下方式执行了 cron:

$ python manage.py crontab add .

并查看活动作业:

$ python manage.py crontab show
f95300a5599dc7687ac79ab51c8bb33c -> ('0 9,21 * * *', 'appname.folder.file.start')

def start():
  logger.info(" process begins!")
  do_something()

注意“start”功能已在生产服务器中测试并且有效。

我还尝试通过在

setting.py
:

添加 CRONJOB 的路径来映射 chronjob 日志
('0 9,21 * * *', 'appname.folder.file.start','>> /Logs/crontab.log')

但是文件

 crontab.log
尚未创建。

有什么建议吗?谢谢!

python django docker cron
5个回答
10
投票

我遇到了同样的问题,这就是我为解决前面提到的问题所做的:

  • 安装在容器中
    cron
  • 在 Dockerfile 中的
    service cron start
    中添加了命令
    CMD
  • 在 Dockerfile 中的
    python manage.py crontab add
    中添加了命令
    CMD

启动容器后,我检查了 cronjob 是否是使用命令

python manage.py crontab show
crontab -l
创建的。在这两种情况下我都可以看到 cronjobs。

我再次测试了它,它可以工作。我使用了以下内容:

docker-compose

command: bash -c "service cron start && python manage.py crontab add && gunicorn serv.wsgi:application --bind 0.0.0.0:8000 --timeout 600 --workers 5"
或 Django 的开发服务器。
python manage.py runserver 0:8000

Dockerfile

FROM  python:3.9

RUN apt-get -y update

# Install cron.
RUN apt-get install -y cron && touch /var/log/cron.log

WORKDIR /app
COPY ./docker/python/django/requirements.txt /app/

RUN pip install -r requirements.txt

COPY ./app/ /app/```

3
投票

Django-crontab 依赖于 cron 守护进程来运行,但许多 docker 镜像并未随其安装或以其他方式启动它。这是 init 程序的责任,大多数程序都没有这个责任。

您检查过 cron 的状态吗?我在生产环境中遇到了同样的情况,并意识到这就是问题所在。

首先通过运行

crontab -l
检查 cronjob 是否已正确安装,这可能取决于您的应用程序运行的用户,因此也许您必须向该命令添加其他选项。

如果安装了 crontab,则通过运行

service cron status
检查 cron 守护进程的状态。如果未启动,请运行
service cron start
并检查之后您的 cron 任务是否正常工作。您可能应该将其添加到您的启动脚本中。


1
投票

我不知道这个问题是否已解决,但我有同样的问题,这个 docker 文件对我有用:

FROM python:3.9-bullseye

RUN pip install --upgrade pip

RUN apt-get update && apt-get install ffmpeg libsm6 libxext6  -y

RUN apt-get install -y cron
RUN service cron start

COPY ./requirements.txt .
RUN pip install -r requirements.txt


COPY . /app

WORKDIR /app

ENV PORT 8080

RUN python3 manage.py crontab add
RUN service cron start 

CMD cron;gunicorn --bind :$PORT --workers 3 --timeout 300 usertest.wsgi:application

0
投票

如果您在生产中使用环境变量,您的 cronjob 可能无法访问它。以下信息可能会有所帮助,

如果您使用的是 Ubuntu >=18.0,请尝试进行以下更改。 我假设您已成功将 django-crontab 与您的 django 应用程序集成。现在,通过 ssh 访问您的服务器并输入“crontab -e”,您将看到您的 cronjobs 在这里定义。将环境变量添加到 cronjob 上方。请看一下下面的几行代码,了解它对您的问题有何意义 -

DB_NAME = "your database name"
DB_USER = "User"
DB_PASSWORD = "password"
SECRET_KEY = "************************"

*/1 * * * * /home/sms/sms/env/bin/python /home/sms/sms/sms- 
backend/website/manage.py crontab run 446aeeebac8c8f82d9e01bb662dc9b21 >> 
/tmp/scheduled_job.log # django>

希望你能摆脱它。


0
投票
  • 在settings.py文件的INSTALLED_APPS中添加django_crontab

    CRONJOBS = [ ('5 * * * *', 'attendance.cron.print_message', '>> /var/log/cron.log 2>&1'), ]

这是我的 DockerFile

FROM python:3.9
ENV PYTHONUNBUFFERED=1
RUN apt-get update \
&& apt-get install gcc -y \
&& apt-get clean \
&& apt-get install gunicorn3 -y \
#&& apt-get install python3.9-dev -y \
&& apt-get install libcurl4-gnutls-dev librtmp-dev -y \
&& apt-get install libnss3 libnss3-dev iputils-ping  -y \
&& apt-get install -y cron && touch /var/log/cron.log
RUN touch /var/log/attendance_system.log
WORKDIR /attendance_system
COPY requirements.txt /attendance_system/
RUN pip install -r requirements.txt
COPY . /attendance_system/

RUN chmod +x common_commands.sh
RUN bash common_commands.sh

EXPOSE 8000
EXPOSE 8001

这是我的common_commands.sh 文件

#!bin/bash

crontab -r                        # remove exist one
python manage.py crontab add      # add

exec "$@"

这是我的网络容器:

web:
    container_name: attendance_system
    build: .
    command: bash -c "service cron start  && daphne -b 0.0.0.0 -p 8000 AttendanceSystem.asgi:application"
    #    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/attendance_system
    ports:
      - "8000:8000"
    environment:
      - TZ=Asia/Karachi
    depends_on:
      - db
      - redis

注:

  • 请将文件名设置为我使用的项目名称asgi 不是wsgi
  • 确保 Web 容器应在该容器中运行 Enter 并检查 python 和容器日期时间

命令:

sudo docker-compose exec -it **container_name or ID** /bin/bash
python
from datetime import datetime
print(datetime.now())    

print 会将您当前的日期时间显示为本地计算机(如果没有),然后按照我在 Web 容器中设置的方式设置 docker 容器的时区。

© www.soinside.com 2019 - 2024. All rights reserved.