Cómo ejecutar cron en el contenedor Docker desde la image de Ruby

He intentado configurar cron para ejecutar en mi contenedor Docker, pero hasta ahora sin éxito.

Estas son las partes relacionadas con cron del Dockerfile :

 FROM ruby:2.2.2 # Add crontab file in the cron directory RUN apt-get install -y rsyslog ADD crontab /etc/cron.d/hello-cron # Give execution rights on the cron job RUN chmod +x /etc/cron.d/hello-cron # Create the log file to be able to run tail RUN touch /var/log/cron.log # Run the command on container startup RUN service cron start 

Cuando inicio session en la instancia del contenedor, cron parece estar ejecutándose:

 $ service cron status cron is running. 

Y /etc/cron.d tiene mi trabajo:

 $ cat /etc/cron.d/hello-cron * * * * * root echo "Hello world" >> /var/log/cron.log 2>&1 

Pero no se agrega nada a /var/log/cron.log , por lo que parece que no se ejecuta.

Si luego, desde dentro del contenedor, ejecuta $ cron , registra mi file hello-cron y el file de logging tendrá "Hello world" anexado cada minuto.

Su análisis es correcto, los trabajos cron no se están ejecutando. Esto sucede porque normalmente, y según las prácticas recomendadas, el contenedor solo ejecuta un único process, como Apache, NGINX, etc., no ejecuta ninguno de los demonios normales del sistema operativo, como crond.

No crond significa, no hay nada que lea o ejecute su crontab.

Hay varias posibilidades para resolver esto, pero no hay una solución perfecta que yo sepa.

  • El peor es instalar crond, junto con algo así como supervisar. Hace su contenedor dramáticamente más complejo.

  • Puede crear un contenedor separado que ejecute nada más que cron. Monte lo que necesite de los otros contenedores como volúmenes. Esta es generalmente la opción recomendada, pero tiene limitaciones. El contenedor cron necesita saber mucho sobre las partes internas de sus otros contenedores, y los trabajos cron no se ejecutan en el mismo context que el rest de los contenedores.

  • Puede crear un trabajo cron en el host y hacer que ejecute scripts en los contenedores con docker exec. Eso funciona bien, pero crea una dependencia entre el host y el contenedor. También puede no funcionar en absoluto si no tiene acceso al sistema operativo del host (por ejemplo, en una situación alojada, o si un equipo diferente administra el host).