Cómo configurar Apache Airflow en Docker con persistencia de datos y JDBC

Apache Airflow es una potente plataforma para gestionar flujos de trabajo, permitiendo programar y monitorear pipelines de datos. Sin embargo, su configuración puede ser algo compleja. Aquí es donde Docker se convierte en una solución ideal 🚀. Con Docker, puedes empaquetar todo el entorno de Airflow, incluyendo dependencias y configuraciones, en contenedores que pueden ser desplegados en cualquier lugar.

En este artículo, configuraremos Apache Airflow en Docker 🐳, asegurando la persistencia de datos y añadiendo soporte para JDBC, lo que permitirá conectar Airflow con diversas bases de datos.

⚙️ Requisitos previos

Antes de comenzar, asegúrate de tener instalados los siguientes componentes:

🗂️ Crear estructura de ficheros

Primero, crearemos una carpeta para almacenar el proyecto y dentro de esta, la estructura de ficheros necesaria:

mkdir airflow_docker && cd airflow_docker && mkdir plugins dags logs drivers

📄 Crear el Dockerfile

Dentro de la carpeta airflow_docker, crea un archivo llamado Dockerfile:

FROM apache/airflow:2.7.0
# Instala el proveedor JDBC
RUN pip install apache-airflow-providers-jdbc
# Actualiza el proveedor OpenLineage a una versión compatible
RUN pip install --upgrade apache-airflow-providers-openlineage
# (Opcional) Si necesitas copiar controladores específicos
COPY drivers /opt/airflow/drivers

🛠️ Generar el docker-compose

A continuación, crea el archivo docker-compose.yml en la misma carpeta:

version: '3'
services:
  postgres:
    image: postgres:15
    environment:
      POSTGRES_USER: airflow
      POSTGRES_PASSWORD: airflow
      POSTGRES_DB: airflow
    volumes:
      - postgres_data:/var/lib/postgresql/data

  airflow-init:
    build: 
      context: .
      dockerfile: Dockerfile
    depends_on:
      - postgres
    environment:
      AIRFLOW__CORE__EXECUTOR: LocalExecutor
      AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow
      AIRFLOW__CORE__FERNET_KEY: (FERNET KEY)
      AIRFLOW__CORE__LOAD_EXAMPLES: 'true'
    volumes:
      - ./dags:/opt/airflow/dags
      - ./logs:/opt/airflow/logs
      - ./plugins:/opt/airflow/plugins
      - ./airflow:/opt/airflow
    entrypoint: >
      bash -c "
      airflow db upgrade &&
      airflow users create --username admin --password admin --firstname Admin --lastname User --role Admin --email [email protected]
      "
    restart: no

  webserver:
    build: 
      context: .
      dockerfile: Dockerfile
    depends_on:
      - postgres
      - airflow-init
    ports:
      - "8080:8080"
    environment:
      AIRFLOW__CORE__EXECUTOR: LocalExecutor
      AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow
      AIRFLOW__CORE__FERNET_KEY: (FERNET KEY)
    volumes:
      - ./dags:/opt/airflow/dags
      - ./logs:/opt/airflow/logs
      - ./plugins:/opt/airflow/plugins
      - ./airflow:/opt/airflow
    command: ["webserver"]

  scheduler:
    build: 
      context: .
      dockerfile: Dockerfile
    depends_on:
      - postgres
      - airflow-init
    environment:
      AIRFLOW__CORE__EXECUTOR: LocalExecutor
      AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow
      AIRFLOW__CORE__FERNET_KEY: (FERNET KEY)
    volumes:
      - ./dags:/opt/airflow/dags
      - ./logs:/opt/airflow/logs
      - ./plugins:/opt/airflow/plugins
      - ./airflow:/opt/airflow
    command: ["scheduler"]

volumes:
  postgres_data:

💡 Tip: Sustituye (FERNET KEY) por una clave generada para mayor seguridad.

🏗️ Levantar Airflow

Para iniciar Airflow y sus servicios asociados (webserver, scheduler y base de datos), ejecuta el siguiente comando:

docker-compose up -d

Esto levantará todos los servicios necesarios, y deberías poder acceder a la interfaz de Airflow en http://localhost:8080 con el usuario admin y la contraseña admin.