Sign inSign up

pindu/cron-python

By pindu

Updated 9 months ago

Cron para ejecutar script de python

Image
Operating systems
1

4.8K

pindu/cron-python repository overview

Dockerizado para el ETL de listas de proveedores de repuestos para vehículos en Argentina

Docker Alpine Linux Python Pandas PostgreSQL Django REST framework SQLAlchemy python-dotenv Google Generative AI SpeechRecognition

Referencia Rápida

Mantenido Por: PINDU

Descargo de Responsabilidad:

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.

Donaciones:

Si encuentras útil este proyecto y deseas contribuir a su mantenimiento, considera hacer una donación. Tu apoyo es muy apreciado.

Donate

Resumen:

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.

Palabras clave: Docker, Alpine Linux, cron jobs
Configuración del Contenedor Cron en Docker

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
      "
Modificación del Archivo de Configuración Cron: ./crond.d/crontab

El 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
Descripción del Dockerfile para Construir la Imagen Docker

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:

  • pandas: Utilizado para la manipulación y análisis de datos.
  • SQLAlchemy: Un ORM (Object-Relational Mapping) que facilita la interacción con bases de datos SQL.
  • zopfli: Una implementación de compresión compatible con gzip y zlib.
  • brotli: Un algoritmo de compresión utilizado para la compresión de datos.
  • psycopg[binary,pool]: Un adaptador de base de datos PostgreSQL para Python, con soporte para conexiones en pool.
  • python-dotenv: Carga variables de entorno desde un archivo .env.
  • requests: Una biblioteca HTTP para Python, fácil de usar y con una sintaxis simple, que permite enviar solicitudes HTTP/1.1 con métodos como GET y POST, manejar cookies, y gestionar sesiones.
  • xlrd: Una biblioteca para leer datos e información de formato de archivos Excel en el formato histórico .xls. Es útil para extraer datos de archivos Excel antiguos.
  • openpyxl: Una biblioteca de Python para leer/escribir archivos Excel 2010 xlsx/xlsm/xltx/xltm. Permite crear, modificar y extraer información de archivos Excel de manera programática.
  • google-generativeai: Una biblioteca para interactuar con los modelos de inteligencia artificial generativa de Google, permitiendo la creación de contenido y respuestas automatizadas.
  • SpeechRecognition: Una biblioteca de Python que permite el reconocimiento de voz, facilitando la conversión de audio en texto.

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.

Tag summary

Content type

Image

Digest

sha256:176e834e7

Size

89.7 MB

Last updated

about 1 year ago

docker pull pindu/cron-python