#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.