315 - Programar tareas en un contenedor
¿Como programar tareas en un contenedor?¿Porque poner cron en un contenedor?¿Como relacionarlo con otros contenedores para programar tareas?
Este es el segundo episodio de la serie sobre el cambio del sistema de donaciones en atareao.es. El el episodio anterior te expliqué las razones que me habían llevado a este cambio. De donde partía y hacia donde quería llegar. Te conté que opciones había barajado y porque finalmente me había quedado con buymeacoffee. En este segundo episodio y en los siguientes, toca contarte los aspectos técnicos. Al final esto es lo que nos va el tema del cacharreo. En particular, quiero contarte como he resuelto el problemilla del polling es decir, que no tengo Webhook disponible para determinados eventos. Básicamente, y como verás a lo largo del podcast, lo he resuelto a base de programar tareas en un contenedor.
En este sentido, indicarte que se ha unido un nuevo episodio a esta serie. Un nuevo episodio que todavía es pronto para que te revelo su contenido. Lo cierto es que esto es un sobre la marcha, porque te voy contando cada uno de los episodios conforme entran en producción. Eso si, un producto mínimo viable, pero un producto.
Y por otro lado, todo acelerado, por un grupo de ansias que me están espoleando para que trabaje prácticamente a destajo.
Programar tareas en un contenedor
Antes de adentrarme y explicarte esto de como he resuelto el problema del polling o la falta de webhook, a base de programar tareas en un contenedor, quiero comentar algunas cuestiones, que realmente me resultan importantes como verás a continuación.
Sobre los contenedores
Las dos herramientas que mas me han ayudado a profundizar en el conocimiento de Linux, son sin lugar a dudas, la Raspberry por un lado, y Docker por el otro. En este sentido, es precisamente esta segunda, la que tiene su importancia en este episodio del podcast.
Dentro de todas las opciones que ofrece Docker, es muy interesante la posibilidad de levantar un servicio. Y también te ayuda a tener una visión mas certera del mundo Linux. Sin embargo, lo que mas me ha ayudado a profundizar en el mundo Linux, es sin lugar a dudas, construir mis propias imágenes.
No hace falta hacer una imagen realmente compleja, puedes empezar con imágenes realmente simples, y poco a poco haciéndolas mas y mas complejas. Es decir, puedes iniciarte con un simple script que lance un Hola Mundo, para llegar a montarte todo un stack de monitorización con Chronograf, Influxdb y telegraf, por citar algo.
Pero además tienes otra ventaja a la hora de profundizar en Linux, y es que tocas otras distribuciones. En este sentido, para hacer las imágenes lo mas reducidas posible, estoy utilizando por regla general Alpine.
Aunque recientemente, leí que el desempeño de Python3 con Alpine, dejaba que desear, que el mejor o de las mejores distribuciones, en relación al desempeño era Ubuntu. Aquí todo depende de ti, depende de tu imaginación y lo que tu quieras hacer.
Y no solo esto, sino que, si además desarrollas tu propio servicio, por ejemplo en Python con Flask, como con el tutorial de creación de Bots para Telegram, esto, va mucho mas allá.
¿Porque en un contenedor?
Ahora te estarás preguntando que porque estoy poniendo tanto énfasis en esto de los contenedores. La razón es sencilla. Hace tiempo que intento que todas las integraciones, aplicaciones, herramientas, etc, que implemento, terminen en un contenedor. Si te preguntas porque, indicarte que hay dos razones fundamentales,
- Las dependencias. Con una contenedor no te tienes que preocupar de las dependencias asociadas a una aplicación o herramienta. Todo lo que necesitas está en esa imagen. Todo, absolutamente todo. Y no solo esto, sino que además si no está, simplemente lo añades ala imagen que estás creando. Por esto es por lo que comentaba el tema de profundizar en Linux. Aquí aprendes a buscar, instalar y utilizar paquetes, que por regla general ni te preocupas.
- Los deslieges. Desplegar un contenedor es mucho mas sencillo que instalar una aplicación. En realidad, la instalación ya la hiciste en la imagen. Así en cualquier otra máquina simplemente tienes que descargar la imagen, y como mucho copiar los archivos de configuración… y poco mas, y esto se hace con la gorra. No es necesario que tengas una chuleta con los pasos a seguir, simplemente un
docker pull
y a correr.
En otras circunstancias, haciendo una instalación tradicional, en ocasiones, falta dependencias, porque estás en una versión anterior o posterior de la que utilizaste para desarrollar la aplicación. Ha cambiado la configuración. O has perdido algún archivo de la aplicación, o has perdido toda la aplicación, porque el VPS donde estabas haciéndolo le ha sucedido alguna desgracia.
Maldito cron
Ya adelante en el episodio anterior del podcast que mi lado emocional se había impuesto a mi lado racional. Me decanté por BuyMeACoffee, sin haber entrado a fondo en la parte técnica. No analicé con detalle sin cumplía al 100% mis necesidades. Error, error de primero de APIS. Que error garrafal cometí. Sin embargo, como verás a continuación, lo he conseguido resolver a base de ingenio o mas bien de programar tareas en un contenedor.
Tengo que decir, que ahora que me he decantado por BuyMeACoffee no he revisado si Ko-fi si que cumpliría mis necesidades. Ahora para que, una vez metidos en harina, se trata de seguir para adelante.
¿A que problema me refiero? BuyMeACoffee tiene webhook, pero no para todas las operaciones que se realizan. Así para el caso de donaciones puntuales si que tiene webhook, pero para suscripciones no existe…
Lo cierto es que se trata de automatizar todo lo automatizable, desde las donaciones puntuales hasta las donaciones periódicas o suscripciones. Así que había que buscarle remedio.
Como he dicho soy mas del webhook, que del polling. Simplemente me parece algo mucho mas interesante. Puedes estar dedicado a otras cosas. Pero, como no puede ser, vamos a hacer polling.
En este sentido me planteé varias opciones,
- Utilizar
systemd
ocron
en el host - Implementar un servicio que hiciera el polling, por supuesto en un contenedor
- Hacer un imagen con un cron.
Finalmente me decanté por este último. Quería algo que me permitiera desplegar de forma sencilla, tener que crear un servicio de systemd
o utilizar el cron
del host no me parecía lo mas adecuado
Programar tareas en un contenedor
La solución ha sido implementar croni. Se trata de tener cron
en un contenedor, como te mencionaba anteriormente. No ha sido nada excesivamente complicado, pero ha tenido su miga.
Lo mas interesante ha sido descubrir tini. Se trata de un init
para contenedores, que viene a resolver una serie de problemas. Sin embargo, no quiero entrar mucho mas en detalle, porque le dedicaré un artículo próximamente.
La cuestión es que para enlazar un contenedor con el otro, los he puesto en una red interna, para que no haya acceso desde el exterior. Y luego, simplemente es hacer un curl
de un contenedor a otro. Bueno, en uno estará programado. Programado, igual que se programa un cron
, de los de toda la vida.
Espero que te haya gustado este nuevo episodio del podcast. Si puedes, te agradecería una valoración en iVoox y/o en Apple Podcast.
Imagen de portada de Lukas Blazek
Hola!! No me funciona el enlace de buymeacoffee, es posible?
Hola Alfonso,
Toda la razón. Ya lo he corregido. Muchas gracias por el aviso
Saludos