3

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:

introducir la descripción de la imagen aquí

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 ...

1 respuesta 1

0

Después de probar diferentes formas de manipular los archivos y crear las necesidades en un orden apropiado para integrar la utilidad cron en un contenedor y mantenerla funcionando, esto era necesario:

  1. Elimine el command y algunos parámetros/sección de volumenes de mi archivo docker-compose.yml. Ahora se ve así:
version: "3.8"

services:
  reverse-proxy:
    env_file:
      - .env
    container_name: Proxy-Server
    image: jwilder/nginx-proxy
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
    ports:
      - "${LH_HOST_MACHINE_UNSECURE_HOST_PORT}:80"
    depends_on:
      - webserver
      - phpmyadmin
    networks:
      - lamp-network
    extra_hosts:
      - "${LH_WEB_SERVER_DOMAIN}:127.0.0.1"
      - "${LH_PHPMYADMIN_DOMAIN}:127.0.0.1"
      - "${LH_CRON_DOMAIN}:127.0.0.1"
      - "${LH_INCRON_DOMAIN}:127.0.0.1"
  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}:/var/www/html/public:rw
      - ${LH_VHOSTS_DIR}:/etc/apache2/sites-enabled
      - ${LH_PHP_INI}:/usr/local/etc/php/php.ini
      - ${LH_LOG_DIR}:/var/log/apache2
      - ${LH_LOG_CRON}:/var/log/cron
    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"
  database:
    env_file:
      - .env
    build:
      context: ./bin/${LH_DATABASE}
    container_name: ${LH_SYSTEM_NAME}-${LH_DATABASE}
    restart: always
    networks:
      - lamp-network
    ports:
      - "127.0.0.1:${LH_HOST_MACHINE_MYSQL_PORT}:${LH_HOST_MACHINE_MYSQL_PORT}"
    volumes:
      - ${LH_MYSQL_INITDB_DIR}:/docker-entrypoint-initdb.d
      - ${LH_MYSQL_DATA_DIR}:/var/lib/mysql
      - ${LH_MYSQL_LOG_DIR}:/var/log/mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${LH_MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${LH_MYSQL_DATABASE}
      MYSQL_USER: ${LH_MYSQL_USER}
      MYSQL_PASSWORD: ${LH_MYSQL_PASSWORD}
  phpmyadmin:
    env_file:
      - .env
    container_name: ${LH_SYSTEM_NAME}-phpmyadmin
    image: phpmyadmin/phpmyadmin
    restart: always
    depends_on:
      - database
    environment:
      VIRTUAL_HOST: ${LH_PHPMYADMIN_DOMAIN}
      PMA_HOST: database
      PMA_PORT: 3306
      PMA_USER: root
      PMA_PASSWORD: ${LH_MYSQL_ROOT_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${LH_MYSQL_ROOT_PASSWORD}
      MYSQL_USER: ${LH_MYSQL_USER}
      MYSQL_PASSWORD: ${LH_MYSQL_PASSWORD}
      UPLOAD_LIMIT: ${LH_UPLOAD_LIMIT}
      MEMORY_LIMIT: ${LH_MEMORY_LIMIT}
    volumes:
      - /sessions
      - ${LH_PHP_INI}:/usr/local/etc/php/conf.d/php-phpmyadmin.ini
    networks:
      - lamp-network
networks:
  lamp-network:
    driver: bridge
  1. Cambié las secuencias de comandos en mi Dockerfile con otro enfoque:
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 --no-install-recommends --fix-missing tzdata sed build-essential dialog nano apt-utils cron wget git curl zip openssl

RUN apt-get -y autoremove && \
    apt-get clean

RUN rm -rf /usr/src/* && \
    rm -rf /var/lib/apt/lists/*

RUN mkdir -p /var/log/cron && \
    chmod 755 /var/log/cron && \
    touch /var/log/cron/cron.log

RUN echo "* * * * * root /var/www/html/Asset/resource/cron/cron.sh >> /var/log/cron/cron.log 2>&1" > /etc/cron.d/cron-task && \
    chmod 0644 /etc/cron.d/cron-task

CMD cron && /usr/local/bin/apache2-foreground && chmod +x /var/www/html/Asset/resource/cron/cron.sh && tail -f /var/log/cron/cron.log

Lo más importante fue la implementación de CMD para solucionar casi todos los problemas detectados y crear los archivos desde Dockerfile en lugar de montarlos.

No estoy seguro de si es el camino correcto o la mejor forma de hacerlo, pero realmente ha sido la unica forma de dejarlo andando.

notas adicionales:

  • Es importante incorporar al inicio del CMD el punto de entrada o que implementa la imagen, ya que el usar el CMD sustituye el CMD por defecto provocando problemas.
  • También es importan que si se implementara tail... se haga al final ya que esto suele bloquear el script y la ejecución.

¿No es la respuesta que buscas? Examina otras preguntas con la etiqueta o formula tu propia pregunta.