Despues de varios dias trasteando con Docker no he dado con una solucion a mi problema.
En resumidas he intenatdo meterle cron
a php:8.1-apache-bullseye
y pasarle un archivo con el task que quiero que ejecute el servicio cron:
contenido de cron-task
:
* * * * * /var/www/html/Asset/resource/cron/cron.sh >> /var/log/cron/cron.log 2>&1
contenido de cron.sh
:
#!/bin/bash
# Obtener la hora actual
current_time=$(date +"%H:%M:%S")
# Mensaje de advertencia
message="warning: Hello, world!!"
# Imprimir la hora y el mensaje en la salida estándar
echo "${current_time}: ${message}"
Para levantar todo tengo una seccion de mi docker-compose.yml en donde levanto un servicio webserver de la siguiente forma:
webserver:
env_file:
- .env
container_name: ${LH_SYSTEM_NAME}-Web-Server
build:
context: ./bin/${LH_PHP_ENVIRONMENT}
restart: always
networks:
- lamp-network
depends_on:
- database
volumes:
- ${LH_PROJECT_ROOT}:/var/www/html:rw
- ${LH_PROJECT_ROOT}${LH_DOCUMENT_ROOT-./public}:/var/www/html/public:rw
- ${LH_VHOSTS_DIR}:/etc/apache2/sites-enabled
- ${LH_PHP_INI}:/usr/local/etc/php/php.ini
- ${LH_CRON}:/etc/script/cron-task
- ${LH_LOG_CRON}:/var/log/cron
- ${LH_LOG_DIR}:/var/log/apache2
environment:
LH_WEB_MASTER: ${LH_WEB_MASTER}
VIRTUAL_HOST: ${LH_WEB_SERVER_DOMAIN}
LH_APACHE_DOCUMENT_ROOT: ${LH_APACHE_DOCUMENT_ROOT}
LH_DOCUMENT_ROOT: ${LH_DOCUMENT_ROOT}
HOST_MACHINE_MYSQL_PORT: ${LH_HOST_MACHINE_MYSQL_PORT}
MYSQL_DATABASE: ${LH_MYSQL_DATABASE}
MYSQL_ROOT_PASSWORD: ${LH_MYSQL_ROOT_PASSWORD}
MYSQL_USER: ${LH_MYSQL_USER}
MYSQL_PASSWORD: ${LH_MYSQL_PASSWORD}
extra_hosts:
- "host.docker.internal:host-gateway"
command: [ "/bin/sh", "-c", "chmod +x /var/www/html/Asset/resource/cron/cron.sh && cp /etc/script/cron-task /etc/cron.d/cron-task && chmod 0644 /etc/cron.d/cron-task && crontab /etc/cron.d/cron-task && cron -f && service cron restart" ]
Nota: Podemos ignorar las Variables de Entorno ya que todas fueron probadas y verificadas una a una y hacen lo que se espera que hagan...
Adicional estoy implementando la sección de command
a ver si así soluciono los problemas, pero por lo que he visto y hecho pruebas no sirve tampoco.
Comandos que se ejecutan en command:
chmod +x /var/www/html/Asset/resource/cron/cron.sh
cp /etc/script/cron-task /etc/cron.d/cron-task
chmod 0644 /etc/cron.d/cron-task
crontab /etc/cron.d/cron-task
cron -f
service cron restart
para que el archivo dentro del contenedor quede ubicado correctamente... todo esto funciona bien, incluso los comando ejecutados en command no he tenido interrupcion o mensajes de errores en la construccion y puesta en marcha de los contenedores.
Entonces mi Dockerfile contiene lo siguiente:
FROM php:8.1-apache-bullseye
ARG DEBIAN_FRONTEND=noninteractive
RUN a2enmod rewrite headers
RUN service apache2 restart
RUN apt-get update && \
apt-get upgrade -y --no-install-recommends --fix-missing
RUN apt-get install -y cron nano wget dialog build-essential git curl zip openssl --no-install-recommends --fix-missing
RUN apt-get -y autoremove && \
apt-get clean
ENV VISUAL=nano
ENV EDITOR=nano
RUN service cron start
RUN rm -rf /usr/src/* && \
rm -rf /var/lib/apt/lists/*
RUN update-rc.d cron enable
Esto tampoco me arroja ningun problema... ahora me voy a la terminal de mi contenedor webserver, y a pesar de que luego valido con:
service cron status
y el output dice que se esta ejecutando...
Aptura del contenido de crontab -e
:
Al final el problema es que nunca ocurre nada automaticamente ... como si el servicio cron estuviera detenido...
por si acaso hice pruebas de ejecucion sobre el archivo .sh y todo funciona bien desde la terminal.
incluso agregar el registro al log... pero cuando espero que lo haga el servicio cron no pasa nada... y ya no se que hacer o donde buscar...
Update:
la salida de: ps aux | grep cron
fue:
root 1 0.0 0.0 2480 516 ? Ss 21:46 0:00 /bin/sh -c chmod +x /var/www/html/Asset/resource/cron/cron.sh && cp /etc/script/cron-task /etc/cron.d/cron-task && chmod 0644 /etc/cron.d/cron-task && crontab /etc/cron.d/cron-task && cron -f && service cron restart
root 11 0.0 0.0 3744 2444 ? S 21:46 0:00 cron -f
root 78 0.0 0.0 3240 712 pts/0 S+ 22:11 0:00 grep cron
por lo que parece que a pesar de todo lo que e intentado la tarea no esta en el cron ... sigo sin saber que hacer ...