django-crontab无法在docker python上工作:3.9-buster镜像

r7knjye2  于 2023-04-11  发布在  Docker
关注(0)|答案(1)|浏览(131)

我试着每分钟运行一个cronjob,作为测试,在我的django应用程序上使用django_crontab。我试着运行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-已cron.py在myapp文件夹中创建文件www.example.com

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

PART 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时,它是空的...
我该怎么办?

dgtucam1

dgtucam11#

我在Django 4和docker中遇到了类似的问题。服务启动了(你可以用service cron status检查),crontab安装了,但没有执行。
我的步骤是重新启动服务,然后我发现一个错误的日志。当crontab执行尝试构建settings.py,找不到任何env,即使他们在那里。
我的问题是,当crontab在docker容器中运行时,由于某种原因,无法读取容器的envs,但当我手动运行时,它可以工作。
我的解决方法是将docker envs复制到.env文件项目根目录,然后我的cron工作得很好。

env > app/.env

相关问题