Запуск программы на Python с помощью cron, Docker и Supervisor

#python #docker #cron #supervisord

#python #docker #cron #супервизор

Вопрос:

Когда я запускаю сборку контейнера с помощью CMD, CMD /usr/bin/python3 /app/test.py все работает нормально, и я вижу вывод, но когда я запускаю CMD, в качестве CMD ["/usr/bin/supervisord", "-n"] которого запускаются supervisor и cron, я не вижу вывода. Похоже, что файл python не запущен, или я неправильно настроен для просмотра ведения журнала.

Как я могу убедиться, что файл python запущен, и как я могу увидеть результат?

Мой файл Dockerfile:

 FROM ubuntu:16.04

RUN apt-get update
RUN apt-get install -y apt-utils -y cron -y liblapack3 -y build-essential 
                    -y python3-dev -y python3-setuptools -y python3-numpy 
                    -y python3-scipy -y python3-pip -y libatlas-dev 
                    -y supervisor


COPY . /app

# install requirements (early and on their own to leverage caching)
COPY ./requirements.txt /app/requirements.txt
RUN pip3 install -r /app/requirements.txt

# make script executable
RUN chmod  x /app/test.py

# do cron stuff
COPY ./crontab /etc/cron.d/crontab
RUN chmod 0644 /etc/cron.d/crontab

CMD cron amp;amp; tail -f /var/log/cron.log


COPY ./supervisord.conf /etc/supervisor/conf.d/supervisord.conf

# CMD ["/usr/bin/supervisord", "-n"]
CMD /usr/bin/python3 /app/test.py
  

supervisord.conf является:

 [supervisord]
nodaemon=true
loglevel=debug

[program:cron]
command = cron -f -L 15
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
  

crontab — это:

 * * * * * root /usr/bin/python3 /app/test.py
* * * * * root echo "hello world" >> /var/log/cron.log 2>amp;1
  

и test.py есть:

 #!/usr/bin/env python
import logging

from lib.rig import settings

#set logging level to INFO
logging.getLogger().setLevel(settings.get('logging_level'))

logging.info('LOLOLOL')
print('this is a print')
  

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

1. Я не вижу ПУТИ, crontab который может привести к тому, что программа python не будет выполнена — если у вас ее там нет, просто добавьте что-то вроде SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin — проверьте 34.1.1. Настройка задач Cron

Ответ №1:

Вам не хватает PATH объявления переменной среды, из-за чего ваше приложение на Python не запускается. Редактирование вашего файла Dockerfile следующим образом должно устранить проблему для вас:

 FROM ubuntu:16.04

ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# This is the line that matters ^^

RUN apt-get update
...
  

Подробнее о ENV переменной см. Здесь .