Запуск задания cron внутри контейнера с кодом python и базой данных postgres

#postgresql #docker #cron

Вопрос:

Я новичок в docker, и я создал контейнер с python postgres, который запускает скрипт python, который собирает некоторые данные и записывает их в базу данных SQL. Теперь мне нужно настроить выполнение этого задания каждый день. А потом начался кошмар. Мне не удалось создать отдельный контейнер для этого задания, поэтому я попытался создать файл и скопировать его в контейнер через DockerFile (см. Этот ниже). Мне не удалось запустить cron в качестве точки входа для контейнера, потому что тогда моя база данных не была смонтирована. Итак, я создаю контейнер, получаю к нему доступ, предоставляю полные права доступа к /var/www/html и создаю таблицу базы данных. А затем я запускаю cron. Ошибки нет, но ничего не происходит, журнал не записывается в /var/log/cron.log. Здесь мои файлы:

Dockerfile:

 FROM postgres:latest

USER root
RUN apt-get update amp;amp; apt-get install -y python3 python3-pip
RUN apt-get -y install cron nano
RUN apt-get -y install postgresql-server-dev-10 gcc python3-dev musl-dev

RUN pip3 install psycopg2 
    bs4 
    requests 
    pytz
    
COPY temp-alerts-cron /etc/cron.d/temp-alerts-cron
RUN chmod 0777 /etc/cron.d/temp-alerts-cron
RUN chmod gu rw /var/run/
RUN chmod gu s /usr/sbin/cron
RUN touch /var/log/cron.log
RUN chmod 0777 /var/log/cron.log
RUN crontab /etc/cron.d/temp-alerts-cron

USER postgres

EXPOSE 5432

VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]
 

Временные предупреждения-cron:

 20 13 * * * root /var/www/html/run.sh >> /var/log/cron.log 2>amp;1
# Don't remove the empty line at the end of this file. It is required to run the cron job
 

И вызываемый скрипт:

 echo 'inside thingy'  >> /var/log/cron.log 2>amp;1
python3 /var/www/html/nuria_main.py
 

В случае, если это необходимо, вот docker-compose.yml:

 services:
  postgres: 
    container_name: 'temp-postgres'
    build: # build the image from Dockerfile
      context: ${PWD}   
    volumes: # bind mount volume for Postgres data
     - pg-data:/var/lib/postgresql/data
     - ./python-app:/var/www/html
    restart: unless-stopped
    environment:
     - POSTGRES_USR=xxadmin
     - POSTGRES_DB=tempdb
     - POSTGRES_PASSWORD=secret        
    expose:
     - "5432"   
    networks:
      kong:
networks:
  kong:
    external:
      name: kong_net
volumes:
  pg-data:
 

Надеюсь, кто-нибудь знает, что я делаю неправильно. Я не получаю никаких журналов или ошибок, поэтому я потерян.
Спасибо!

Комментарии:

1. Контейнер запускает только один процесс; какой единственный процесс будет выполняться этим контейнером? Вы можете создать отдельный образ FROM python , не включая в этот образ сервер PostgreSQL, содержащий программу, которую вы хотите запустить, и демон cron для ее запуска.

2. Да, Дэвид прав. Цель контейнера docker — иметь одну «вещь», работающую на контейнер. Если вам нужна более полная система с cron и другими доступными сервисами, вам нужен системный контейнер, такой как lxc / lxd . Или что-то вроде «docker compose», которое обрабатывает несколько контейнеров вместе.

3. Привет! Спасибо. Я пробовал, но у меня не получается, потому что я не понимаю, как работает docker:( Но мне удалось заставить его работать грязным способом. После установки системного журнала в моем контейнере я понял, что время на сервере не такое, как на моей машине. Итак, на самом деле, я просил sth запустить через две минуты, но на сервере был 1 час и две минуты. Была только одна ошибка: мне нужно было удалить «root» из файла temp-alers-cron.