Запуск cron при запуске контейнера предотвращает отображение веб-страницы PHP-скриптом

#php #docker #cron

Вопрос:

Я пытаюсь создать веб-сервис мониторинга, используя docker и PHP

У меня есть PHP-скрипт, который при доступе выполняет проверку, чтобы увидеть, запущено ли несколько служб (путем проверки HTTP-заголовков для конечных точек служб).

У меня есть functions.inc.php файл и index.php файл

Вот мой index.php файл

 <?php
header("Access-Control-Allow-Origin: *");
header("Content-type: application/json");
require('functions.inc.php');

//connect to MySQL DB

include("conn.php");


//Log file - check if it exists - create one if not
$file = "/var/www/html/logs/log".date("Y-m-d").".txt";
if (!file_exists($file)){
    echo "Log file for today does not exist... creating and writing logfilen";
    $logdata = "Monitoring log for: ".date("Y/m/d"."n");
    file_put_contents($file,$logdata,FILE_APPEND);
}else{
    echo "Log file for today existsn";
}

//service.csv can be configured to add 
//or remove services to the monitoring

//Open service config csv
//Check if service.CSV is openable

$services = fopen("/var/www/html/service.CSV",'r');

if($services){
    //Read first line
    fgetcsv($services,1000,',');
    //loop through each service - perform check and write result to file
    while(($value = fgetcsv($services,1000,','))!== FALSE){
        $service=$value[0];

        if(servicecheck($service)){
            $response = "[".$service." - is running]n";
        }else{
            $response = "[".$service." - is not running]n";
        }

        echo $response;
        file_put_contents($file,date("[h:i:sa ")."]".$response,FILE_APPEND);
    }
}else{
    die("Unable to open file");
}
 

В настоящее время я могу запустить скрипт через buidling и запустить его через docker, сделав его доступным через порт 80 локального хоста.

Вот мой первоначальный файл настройки:

 FROM php:7.2-apache
COPY src/ /var/www/html/

RUN docker-php-ext-install mysqli amp;amp; docker-php-ext-enable mysqli

RUN chmod 777 /var/www/html
 

Все это работает так, как задумано. Я могу получить доступ к сервису через localhost:80 в своем браузере.

Однако я хочу, чтобы эти служебные проверки выполнялись даже тогда, когда страница недоступна.

Я обнаружил, что cron был бы подходящим решением для этого, и я попытался его реализовать. Мой новый файл dockerfile выглядит так-

 FROM php:7.2-apache
COPY src/ /var/www/html/

RUN docker-php-ext-install mysqli amp;amp; docker-php-ext-enable mysqli

RUN chmod 777 /var/www/html

RUN apt-get update amp;amp; apt-get -y install cron
# Copy hello-cron file to the cron.d directory
COPY hello-cron /etc/cron.d/hello-cron
 
# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/hello-cron

# Apply cron job
RUN crontab /etc/cron.d/hello-cron

RUN chmod 777 /etc/cron.d/hello-cron

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

Это действительно работает. В терминале докера я вижу, как скрипт запускается каждую минуту. Он выводит на терминал то, что до сих пор выводилось в браузер. Однако теперь я не могу получить доступ к нему через localhost:80 и запустить php-скрипт вручную.

вот мой кронфайл (привет-cron) для справки

 * * * * * /usr/local/bin/php /var/www/html/index.php >> /var/log/cron.log 2>amp;1
# An empty line is required at the end of this file for a valid cron file.
 

Я считаю, что проблема заключается в cron, так как это последняя строка CMD cron amp;amp; tail -f /var/log/cron.log , которая делает страницу недоступной.

Есть ли какое-либо решение для этого? Я относительно новичок во всем этом, поэтому я уверен, что мне чего-то не хватает, но я не могу найти ничего, что помогло бы

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

1. «теперь я не могу получить доступ к нему через localhost:80» Какие симптомы вы видите? Сообщение об ошибке? Браузер зависает? Что-то еще?

2. в моем браузере написано: «Этот сайт недоступен — localhost отказался подключиться».

3. Что происходит, когда вы удаляете только последнюю строку из своего файла Dockerfile?

4. Когда я удалю последнюю строку, я смогу получить доступ к index.php страница в моем браузере. Однако это означает, что контейнер не выполняет задание cron автоматически при запуске

5. Я бы удалил tail -f /var/log/cron.log из последней строки. Чтобы просмотреть эту информацию, вставьте оболочку в контейнер Docker и выполните эту команду самостоятельно из оболочки.