Выполнить скрипт PHP через супервизор в Docker - PullRequest
0 голосов
/ 26 августа 2018

Я хочу выполнять PHP-скрипт в моем докере регулярно, скажем, каждые 5 минут - с контролем супервизора.

Мой Dockerfile:

FROM php:5.6-apache
RUN apt-get update && apt-get install -y \
    cron \
    rsyslog \
    supervisor

COPY supervisord/*.conf /etc/supervisor/conf.d/
COPY crontab /etc/cron.d/cron
RUN rm -Rf /etc/cron.daily  && \
    rm -Rf /etc/cron.weekly && \
    rm -Rf /etc/cron.monthly && \
    rm -Rf /etc/cron.hourly && \
    chmod a+x /etc/cron.d/cron

EXPOSE 80

CMD exec supervisord -n

Мой файл crontab:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
*/5 * * * * root cd /var/www/html/market/autoFetch && /usr/local/bin/php fetchStock.php >/dev/null 2>&1

Что происходит, когда я запускаю свой сервер:

php_1  | /usr/lib/python2.7/dist-packages/supervisor/options.py:298: UserWarning: Supervisord is running as root and it is searching for its configuration file in default locations (including its current working directory); you probably want to specify a "-c" argument specifying an absolute path to a configuration file for improved security.    
php_1  |   'Supervisord is running as root and it is searching '
php_1  | 2018-08-26 08:45:52,515 CRIT Supervisor running as root (no user in config file)
php_1  | 2018-08-26 08:45:52,516 INFO Included extra file "/etc/supervisor/conf.d/supervisord.conf" during parsing
php_1  | 2018-08-26 08:45:52,522 INFO RPC interface 'supervisor' initialized
php_1  | 2018-08-26 08:45:52,523 CRIT Server 'unix_http_server' running without any HTTP authentication checking
php_1  | 2018-08-26 08:45:52,523 INFO supervisord started with pid 1
php_1  | 2018-08-26 08:45:53,526 INFO spawned: 'cron' with pid 8
php_1  | 2018-08-26 08:45:53,528 INFO spawned: 'rsyslogd' with pid 9
php_1  | 2018-08-26 08:45:53,531 INFO spawned: 'apache2' with pid 10
php_1  | 2018-08-26 08:45:54,607 INFO success: cron entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
php_1  | 2018-08-26 08:45:54,607 INFO success: rsyslogd entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
php_1  | 2018-08-26 08:45:54,607 INFO success: apache2 entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
php_1  | 2018-08-26 09:00:11,493 INFO reaped unknown pid 21
...

Сервер работает& похоже, что cronjob работает, как и ожидалось, но вывод, который я ожидаю после выполнения сценария php (создание файла), не происходит.

Я точно перепроверил свою команду:

cd /var/www/html/market/autoFetch && /usr/local/bin/php fetchStock.php >/dev/null 2>&1

Это приведет к созданию файла, который я ожидаю, что скрипт создаст (это займет некоторое время, потому чтоизвлекается много данных) и он выведет все, что было отображено в PHP, в мой терминал.

У вас есть идея, что может пойти не так?

1 Ответ

0 голосов
/ 26 августа 2018

Это не проблема Docker, это проблема ваших настроек.То, что делает /usr/local/bin/php fetchStock.php >/dev/null 2>&1, подробно объяснено здесь , я скопирую его:

>/dev/null перенаправляет стандартный вывод (stdout) на /dev/null,который отбрасывает его.

...

2>&1 перенаправляет стандартную ошибку (2) на стандартный вывод (1), который затем также отбрасывает ее, поскольку стандартный вывод ужебыл перенаправлен.

Вы должны оставить только /usr/local/bin/php fetchStock.php ...

...