【问题标题】:django-crontab not working on docker python:3.9-buster imagedjango-crontab 不适用于 docker python:3.9-buster 图像
【发布时间】:2022-03-28 19:56:28
【问题描述】:

我正在尝试使用 django_crontab 在我的 django 应用程序上每分钟运行一次 cronjob 作为测试。我尝试运行 2 个 cronjob,一个使用 django_crontab,另一个使用我的 cron

第 1 部分 django_crontabs

1- 我已经安装了 django_crontab 并添加到了我的 requirements.txt 中

   pip install django-crontab
   django-crontab==0.7.1

2- 添加到我的 settings.py 中

    INSTALLED_APPS = [
        'django_crontab',
         ...
    ]

    CRONJOBS = [
        ('*/1 * * * *', 'myapp.cron.my_scheduled_job', '>> /var/log/cron.log 2>&1'),
    ]

3- 在文件夹 myapp 中创建了一个文件 cron.py

from datetime import datetime


def my_scheduled_job():
    date = datetime.today().date()
    print(date)
    print('RUNNING CRONTAB YESSSSSSSSSSS!!!!!!!')
    pass
    return True

4- 我的 Dockerfile

FROM python:3.9-buster

WORKDIR /app

COPY ./requirements.txt .

RUN apt-get update && apt-get install libpq-dev gcc python3-dev musl-dev libffi-dev -y && apt-get install -y cron
RUN pip install uwsgi
RUN pip install -r requirements.txt

RUN export PYTHONPATH=$PYTHONPATH:/app/
COPY src/hello-cron /etc/cron.d/hello-cron
RUN chmod 0644 /etc/cron.d/hello-cron
RUN crontab /etc/cron.d/hello-cron
RUN touch /var/log/cron.log

COPY ./src .
ENV PORT=8000
EXPOSE 8000
# Runner script here
CMD ["sh", "/app/runner.sh"]

5- 我的 docker-compose 文件

version: '3.3'

services:
    app:
        build: .
        command: bash -c "python3 ./manage.py crontab add && python3 ./manage.py runserver 0.0.0.0:8000"
        ports:
            - 8000:8000
        volumes:
            - ./src:/app/:Z

第 2 部分 cronjobs linux

6- 我创建了一个名为 hello-cron 的文件,并在上面的 Dockerfile 上使用了当前信息:

* * * * * echo "Hello world" >> /var/log/cron.log 2>&1

当我运行 sudo docker-compose up --build 时,我会进入我的 docker 日志

app_1       |   adding cronjob: (0c7b4daeba89b95a59287e280193e9ca) -> ('*/1 * * * *', 'myapp.cron.my_scheduled_job', '>> /var/log/cron.log 2>&1')
app_1       | Watching for file changes with StatReloader

7- 如果我通过 sudo docker exec -it app_1 bash 访问我的容器 并运行 crontab -l ,我得到:

* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
*/1 * * * * /usr/local/bin/python3 /app/manage.py crontab run 0c7b4daeba89b95a59287e280193e9ca >> /var/log/cron.log 2>&1 # django-cronjobs for portal

但是当我检查我的 /var/log/cron.log 时,它是空的...

我该怎么办?

【问题讨论】:

    标签: python docker cron django-crontab


    【解决方案1】:

    我在 Django 4 和 docker 中遇到了与 crontab 类似的问题。 服务已启动(您可以通过service cron status 进行检查),crontab 已安装但未执行。

    我的步骤是重新启动服务,然后我在日志中发现错误。当 crontab 执行时,尝试构建 settings.py 并找不到任何环境,即使它们在那里。

    我的问题是,当 crontab 在 docker 容器中运行时,由于某种原因,无法读取容器的环境,但是当我手动运行时。

    我的解决方法是将 docker envs 复制到 .env 文件项目根目录,然后我的 cron 工作完美。

    env > app/.env
    

    【讨论】:

    • 嘿 Iamara,感谢您的帮助......好吧,在这两种情况下,我的 django 项目都有效,但他们并不是每秒钟都开始工作。我不认为它与 .env 文件有关..
    猜你喜欢
    • 2022-11-02
    • 2017-11-02
    • 2015-05-28
    • 2021-11-18
    • 2016-04-02
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多