Issue with cron django

I am trying implementing django crontab into my django project. Everything works fine except logging, in the docker container folder with logging does not exist.

My settings


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_crontab',
    'core',
    'crypto',
]
CRONJOBS = [
    ('* * * * *', 'crypto.management.commands.run_cron_job', '>> /var/log/cron.log 2>&1'),
]

Cron task

from django.core.management.base import BaseCommand
from django.utils.timezone import now
import logging

logging.basicConfig(filename="/var/log/cron.log", level=logging.INFO)

class Command(BaseCommand):

    def handle(self, *args, **kwargs):
        logging.info(f"Cron ran at {now()}")
        self.stdout.write(f"Cron ran at {now()}")

Docker compose file

version: '3.8'
services:
    db:
      image: postgres
      container_name:
        postgres_server
      ports:
       - "5432:5432"
      networks:
       - local_network
      volumes:
       - db_data:/var/lib/postgresql/data
      environment:
        POSTGRES_DB: ${POSTGRES_DB}
        POSTGRES_USER: ${POSTGRES_USER}
        POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}

    pg_admin:
      image: dpage/pgadmin4
      environment:
        PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL}
        PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD}
      networks:
        - local_network
      ports:
        - "8080:80"
      depends_on:
        - db

    web:
      working_dir: /app
      container_name:
        app
      image: python
      ports:
        - "8000:8000"

      networks:
        - local_network
      command: >
        bash -c "
        apt-get update && apt-get install -y cron vim &&
        mkdir -p /var/log &&
        touch /var/log/cron.log &&
        chmod 777 /var/log/cron.log &&
        service cron start &&
        pip install -r requirements_test.txt &&
        pip install -r requirements_dev.txt &&
        python manage.py makemigrations &&
        python manage.py migrate &&
        python manage.py crontab add &&
        python manage.py createsuperuser --noinput &&
        python manage.py runserver 0.0.0.0:8000"
      volumes:
        - ".:/app"
      depends_on:
        - db
volumes:
  db_data:
networks:
  local_network:
    driver: bridge

As i mentioned cron works and it has task

docker-compose -f docker-compose_dev.yaml exec web python manage.py crontab show
Currently active jobs in crontab:
e36d0e6e2dc5d1a39d3a1cc3afa68f79 -> ('* * * * *', 'crypto.management.commands.run_cron_job', '>> /var/log/cron.log 2>&1')
docker-compose -f docker-compose_dev.yaml exec web ps aux | grep cron
root         834  0.0  0.0   3600  1848 ?        Ss   20:02   0:00 /usr/sbin/cron

However when i am trying to see the logs it throws error that folder doesnt exist

docker-compose -f docker-compose_dev.yaml exec web tail -f /var/log/cron.log
tail: cannot open 'C:/Program Files/Git/var/log/cron.log' for reading: No such file or directory
tail: no files remaining

How do i fix it?

I was trying to make folder in the container but it failed also.

docker-compose -f docker-compose_dev.yaml exec web bash
mkdir -p /var/log/
touch /var/log/cron.log
chmod 777 /var/log/cron.log

mkdir: cannot create directory ‘/var’: Permission denied
touch: cannot touch '/var/log/cron.log': No such file or directory
chmod: cannot access '/var/log/cron.log': No such file or directory
Вернуться на верх