Tengo un contenedor LAMP con supervisor.
Agrego un cron simple
* * * * * root /bin/date >> /var/log/cron.logde mi Dockerfile
ADD ./crons/test /etc/cron.d/test RUN chmod 0777 /etc/cron.d/test Comienzo cron a través de supervisor con un supervisor-cron.conf como este:
[program:cron] command=/bin/bash -c "cron -f" numprocs=1 autostart=true autorestart=true startretries=2 Cron comienza bien y se mantiene en funcionamiento. Lo extraño es que ningún trabajo cron se ejecuta automáticamente [como debería], pero cuando ejecuto docker exec lamp crontab /etc/cron.d/test , el trabajo cron se inicia y funciona como se esperaba.
¿Me estoy perdiendo de algo? En todas partes he leído que los trabajos cron se ejecutan automáticamente por cron.
Lo resolví.
Intenté configurarlos en /etc/crontab y /etc/cron.d/ .
Cron no inició automáticamente los trabajos cron.
Sin embargo, cuando ejecuto docker exec lamp crontab /etc/cron.d/my_cronjob_file todo funcionó bien. Esto me hizo sospechar, y luego leí esto . Entonces, después de agregar my_cronjob_file en el contenedor [en el dockerfile], agregué RUN crontab /etc/cron.d/my_cronjob_file . Esto esencialmente 'instala' el cronjob en la tabla crontab. [No conozco el funcionamiento interno de cron/tab, pero eso es lo esencial que entendí.] .
Después de eso, el supervisor activa el servicio cron y el cronjob se ejecuta a la perfección.
Esto se puede resolver con el archivo bash, debido a la arquitectura en capas de Docker, el servicio cron no se inicia con los comandos RUN/CMD/ENTRYPOINT.
Simplemente agregue un archivo bash que iniciará el cron y otros servicios (si es necesario)
DockerFile
FROM gradle:6.5.1-jdk11 AS build # apt RUN apt-get update RUN apt-get -y install cron # Setup cron to run every minute to print (you can add/update your cron here) RUN touch /var/log/cron-1.log RUN (crontab -l ; echo "* * * * * echo testing cron.... >> /var/log/cron-1.log 2>&1") | crontab # entrypoint.sh RUN chmod +x entrypoint.sh CMD ["bash","entrypoint.sh"]punto de entrada.sh
#!/bin/sh service cron start & tail -f /var/log/cron-2.log Si también se requiere que otro servicio se ejecute junto con cron, agregue ese servicio con & en el mismo comando, por ejemplo: /opt/wildfly/bin/standalone.sh & service cron start & tail -f /var/log/cron-2.log
Una vez que ingrese al contenedor docker, podrá ver que testing cron.... se imprimirá cada minuto en el archivo: /var/log/cron-1.log