Cron para ejecutar script de python
4.8K
Mantenido Por: PINDU
El código proporcionado se ofrece "tal cual", sin garantía de ningún tipo, expresa o implícita. En ningún caso los autores o titulares de derechos de autor serán responsables de cualquier reclamo, daño u otra responsabilidad.
Si encuentras útil este proyecto y deseas contribuir a su mantenimiento, considera hacer una donación. Tu apoyo es muy apreciado.
Este documento presenta una solución basada en Docker para desplegar una imagen de Alpine Linux que ejecuta scripts ETL con Python, utilizando Pandas y PostgreSQL. Se proporciona el Dockerfile y la configuración de Docker Compose que demuestran la instalación de paquetes necesarios, la configuración de tareas ETL y la integración con PostgreSQL para la gestión de datos. Las características principales incluyen el uso de Alpine Linux para minimizar el tamaño de la imagen, la instalación de las bibliotecas de Python necesarias y la gestión de volúmenes para la persistencia de datos. La solución tiene como objetivo simplificar la implementación y el mantenimiento de procesos ETL eficientes en entornos en la nube, asegurando una fácil integración con bases de datos PostgreSQL para operaciones de análisis de datos.
En este tutorial, configuraremos un contenedor Docker para ejecutar tareas programadas usando cron con un archivo docker-compose.yml. Este archivo define cómo se debe construir y ejecutar el contenedor. A continuación, te explicamos en detalle cada parte de la configuración:
services:
cron:
image: pindu/cron-python
container_name: cron-etl
volumes:
- ./cron.d:/etc/cron.d
- ./code:/code
command: >
sh -c "
chmod 0644 /etc/cron.d/crontab && \
crontab /etc/cron.d/crontab && \
crond -f -L /var/log/cron.log & \
tail -f /var/log/cron.log /var/log/script.log
"
./crond.d/crontabEl archivo ./crond.d/crontab es utilizado para definir los trabajos cron que se ejecutarán dentro del contenedor Docker. A continuación, te explicamos cómo modificar este archivo para ajustar la programación y los comandos de los trabajos cron según tus necesidades.
# * * * * * [UserName] Command_to_execute
# - – – – -
# | | | | |
# | | | | +—– Day of week (0–7) (Sunday=0 or 7) or Sun, Mon, Tue,…
# | | | +———- Month (1–12) or Jan, Feb,…
# | | +————-— Day of month (1–31)
# | +——————– Hour (0–23)
# +————————- Minute (0–59)
* * * * * /bin/sh /code/script.sh >> /var/log/script.log 2>&1
El Dockerfile es un script que define el proceso para construir una imagen Docker personalizada. A continuación, te explicamos detalladamente cada sección de un Dockerfile utilizado para construir una imagen como la pindu/cron-python:
########################################################################################
# Etapa de base
########################################################################################
FROM python:alpine AS base
ENV PYTHON_VERSION="3.14"
LABEL maintainer="Luciano Parruccia <[email protected]>"
LABEL version="1.0"
LABEL description="Imagen para ejecutar un script de Python con cron."
# Instalar dependencias y cron
# hadolint ignore=DL3018
RUN apk update && apk add --no-cache dcron wget \
&& mkdir /code \
&& chmod -R 755 /code \
&& addgroup -g 99 -S pindu && adduser -u 99 -S pindu -G pindu \
&& chown -R pindu:pindu /code
WORKDIR /code
RUN chown -R pindu:pindu /code
# Copiar el archivo crontab al contenedor
COPY ./cron-python/crontab /etc/cron.d/crontab
# Dar permisos a crontab
RUN chmod 0644 /etc/cron.d/crontab
# Crear el archivo de log del script
RUN touch /var/log/cron.log
RUN touch /var/log/script.log
# Verifica la instalación de Python 3
########################################################################################
# Etapa de construcción
########################################################################################
FROM base AS builder
# Instalación de dependencias de construcción
# hadolint ignore=DL3018
RUN apk --no-cache add py3-pillow py3-brotli py3-scipy py3-cffi \
linux-headers autoconf automake libtool gcc cmake python3-dev \
fortify-headers binutils libffi-dev wget openssl-dev libc-dev \
g++ make musl-dev pkgconf libpng-dev openblas-dev build-base \
font-noto terminus-font libffi libpq libpq-dev py3-pip curl \
&& rm -rf /var/cache/apk/*
# Copia solo los archivos necesarios para instalar dependencias de Python
COPY ./cron-python/files/requirements.txt .
# Instalación de dependencias de Python
# hadolint ignore=DL3013
RUN pip install --no-cache-dir --prefer-binary -r requirements.txt \
&& rm requirements.txt
########################################################################################
# Etapa de producción
########################################################################################
FROM base AS final
# Copia solo los archivos necesarios desde la etapa de construcción
COPY --chown=pindu:pindu --from=builder /usr/local/lib/python$PYTHON_VERSION/site-packages /usr/local/lib/python$PYTHON_VERSION/site-packages
#COPY --chown=pindu:pindu --from=builder /usr/lib/python$PYTHON_VERSION/site-packages /usr/lib/python$PYTHON_VERSION/site-packages
ENV PATH=/usr/local/lib/python$PYTHON_VERSION/site-packages:$PATH
RUN ln -s /usr/share/zoneinfo/America/Cordoba /etc/localtime
COPY LICENSE /code/LICENSE
# Establecer el usuario para ejecutar el contenedor
COPY ./cron-python/files /code
RUN chown -R pindu:pindu /code \
&& chmod -R 755 /code
USER pindu
CMD ["sh", "-c", "crond -f -L /var/log/cron.log & tail -f /var/log/cron.log /var/log/script.log "]
Este Dockerfile define cómo se construye la imagen de Docker, especificando la base de la imagen, las dependencias necesarias, los archivos que se copian al contenedor, y las configuraciones adicionales. Cada instrucción en el Dockerfile contribuye a configurar el entorno y las aplicaciones dentro del contenedor, permitiendo una construcción consistente y reproducible de la imagen.
Las librerías utilizadas en la creación de la imagen se especifican en el archivo requirements.txt. Este archivo contiene una lista de las dependencias de Python necesarias para ejecutar los scripts ETL. A continuación, se muestra un ejemplo de cómo podría lucir el contenido de requirements.txt:
########################################################################################
# Basico
python-dotenv
requests
########################################################################################
# PostgreSQL
#zopfli
#brotli
psycopg[binary]
SQLAlchemy
########################################################################################
# Lectura xlsx
pandas
xlrd
openpyxl
########################################################################################
# Bot Discord
google-generativeai
SpeechRecognition #Instalo los binarios
discord
pydub
Estas librerías incluyen:
.env.Estas dependencias aseguran que los scripts ETL puedan interactuar con PostgreSQL y realizar operaciones de análisis de datos de manera eficiente.
Para verificar la calidad y adherencia a las mejores prácticas de tu archivo Dockerfile, puedes utilizar Hadolint, una herramienta de linting para Dockerfiles. Ejecuta el siguiente comando para validar tu Dockerfile:
docker run --rm -i hadolint/hadolint < Dockerfile
Este comando utiliza un contenedor Docker para ejecutar Hadolint, que analizará el Dockerfile y mostrará recomendaciones y advertencias basadas en las mejores prácticas. Asegúrate de reemplazar Dockerfile con la ruta a tu archivo Dockerfile si está en un directorio diferente.
Content type
Image
Digest
sha256:176e834e7…
Size
89.7 MB
Last updated
about 1 year ago
docker pull pindu/cron-python