не запускается файл пайтон в CRON

пытаюсь запускать файл python через cron в docker. Файл не запускается.

файл CRON

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Наши задания
*/10 * * * * root /usr/local/bin/python3 /app/parser.py >> /app/logs/parser.log 2>&1
* * * * * root echo "Cron job running at $(date)" >> /app/logs/cron.log 2>&1n

Dockerfile

# Используем официальный образ Python
FROM python:3.10-slim

# Устанавливаем необходимые зависимости
RUN apt-get update && apt-get install -y cron

# Устанавливаем необходимые Python библиотеки
COPY requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir -r /app/requirements.txt

# Копируем код приложения
COPY . /app

# Устанавливаем рабочую директорию
WORKDIR /app

# Добавляем скрипт в cron
COPY crontab /etc/crontabs/root
RUN chmod 0644 /etc/crontabs/root

# Создаем директорию для логов
RUN mkdir -p /app/logs

# Запускаем cron
CMD ["cron", "-f"]

yaml

services:
  db:
    image: postgres:latest
    environment:
      POSTGRES_DB: coingecko_db
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

  parser:
    build:
      context: .
      dockerfile: Dockerfile
    depends_on:
      - db
    environment:
      DB_HOST: db
      DB_NAME: coingecko_db
      DB_USER: user
      DB_PASSWORD: password
    volumes:
      - ./logs:/app/logs

volumes:
  postgres_data:

файл не запускается каждые 10 минут, логи не появляются в app/logs Подскажите кто знает что делать в этом случае?


Ответы (1 шт):

Автор решения: Рус

лучше всего обернуть запуск в bash скрипт и уже через него запускать скрипт python. у меня сделано вот так, пути указаны для примера, поменяйте на свои

#!/bin/bash

# Настройка
SCRIPT_PATH="/home/path_to/parser.py"
LOG_FILE="/home/path_to/start.log"
TIMESTAMP=$(date +%Y-%m-%d_%H-%M-%S)

# Запуск скрипта с перенаправлением вывода в файл
echo "[$TIMESTAMP] Запуск скрипта..." >> "$LOG_FILE"
/usr/bin/python3 "$SCRIPT_PATH" >> "$LOG_FILE" 2>&1
RETURN_CODE=$?  # Получаем код возврата скрипта

# Проверка кода возврата и логирование
if [ $RETURN_CODE -eq 0 ]; then
  echo "[$TIMESTAMP] Скрипт успешно завершен." >> "$LOG_FILE"
else
  echo "[$TIMESTAMP] ОШИБКА: Скрипт завершился с кодом $RETURN_CODE." >> "$LOG_FILE"
fi

echo "--------------------------------------------------" >> "$LOG_FILE"

а в cron'e так:

*/30 * * * * /home/path_to/start.sh

тут скрипт запуска выполняется раз в 30 минут.

→ Ссылка