#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 и выполните эту команду самостоятельно из оболочки.