0

我创建了一个简单的 Django 应用程序,我想设置一个 cron 作业。我正在使用django-cron包。

我尝试了 2 种方法,第一种没有 docker-compose,我使用了这种方法,但后来我意识到它不起作用,因为 alpine shell 是 BusyBox,并且它没有必要的命令。

然后对于第二种方式,我在 Dockerfile 中注释掉了一些命令,并按照这个存储库中显示的方法。

我在 3 天内几乎尝试了所有方法,但每种方法都有一些无法修复的问题。

牢记以下几点 -

  • Alpine 版本没有, apt-get,命令servicecron
  • 我不想使用 Ubuntu 基础操作系统映像,因为它非常大。
    (但如果你提供一个完美的工作解决方案,我愿意做任何事情)

Dockerfile文件

# syntax=docker/dockerfile:1
FROM python:3.10.2-alpine

ENV PYTHONUNBUFFERED=1

WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .

# Creating DB Tables
RUN python manage.py makemigrations
RUN python manage.py migrate

# Configuring CRONJOB
COPY bashscript /bin/bashscript
# COPY cronjob /var/spool/cron/crontabs/root
# RUN chmod +x /bin/bashscript
# RUN crond -l 2 -b                  # THIS ISN'T WORKING FOR IDK WHAT REASON

RUN python manage.py collectstatic --noinput

EXPOSE 8000

CMD [ "python", "manage.py", "runserver", "0.0.0.0:8000" ]

docker-compose.yml文件

version: "3.9"

services:
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
  mycron:
    build: .
    volumes:
      - .:/code
    entrypoint: sh /usr/src/app/crontab.sh

crontab.sh文件

#!/usr/bin/env bash

# Ensure the log file exists
touch /var/log/crontab.log

# Ensure permission on the command
chmod a+x /bin/bashscript

# Added a cronjob in a new crontab
echo "*/1 * * * * python manage.py runcrons >> /var/log/crontab.log 2>&1" > /etc/crontab

# Registering the new crontab
crontab /etc/crontab

# Starting the cron
/usr/sbin/service cron start   # CAN'T USE THIS BECAUSE service is not a command

# Displaying logs
# Useful when executing docker-compose logs mycron
tail -f /var/log/crontab.log

脚本文件

#!/bin/sh
python manage.py runcrons # THIS IS THE COMMAND I WANT TO EXECUTE EVERY nth MINUTES

定时任务文件

# do daily/weekly/monthly maintenance
# min   hour    day     month   weekday command
*/1     *       *       *       *       /bin/bashscript
4

0 回答 0