2 votes

Airflow : comment exécuter le serveur web et le planificateur ensemble à partir d'une image Docker ?

Je suis un peu inexpérimenté avec Docker et Airflow, donc cela pourrait être une question idiote. J'ai un Dockerfile qui utilise l'image apache/airflow avec quelques-uns de mes propres DAG. J'aimerais lancer le serveur web airflow ainsi que le planificateur et j'ai des problèmes avec ça. Je peux le faire fonctionner, mais j'ai l'impression de m'y prendre de la mauvaise façon.

Voici à quoi ressemble mon Dockerfile :

FROM apache/airflow
COPY airflow/dags/ /opt/airflow/dags/
RUN airflow initdb

Ensuite, j'exécute docker build -t learning/airflow .. Voici la partie difficile : ensuite, j'exécute docker run --rm -tp 8080:8080 learning/airflow:latest webserver et dans un terminal séparé, j'exécute docker exec `docker ps -q` airflow scheduler. Le problème est que, en pratique, cela se produit généralement sur une machine virtuelle quelque part, donc ouvrir un deuxième terminal n'est tout simplement pas une option et de multiples machines n'auront probablement pas accès au même conteneur Docker. Exécuter webserver && scheduler ne semble pas fonctionner, le serveur semble bloquer et je continue de voir le message "Le planificateur ne semble pas être en cours d'exécution" dans l'interface utilisateur Airflow.

Des idées sur la bonne façon de lancer le serveur et le planificateur?

Merci beaucoup!

3voto

IVR Points 458

Tout d'abord, merci à @Alex et @abestrad d'avoir suggéré docker-compose ici -- je pense que c'est la meilleure solution. J'ai enfin réussi à le faire fonctionner en me référant à ce super article. Voici donc ma solution :

Tout d'abord, mon Dockerfile ressemble maintenant à ceci :

FROM apache/airflow
RUN pip install --upgrade pip
RUN pip install --user psycopg2-binary
COPY airflow/airflow.cfg /opt/airflow/

Remarquez que je ne copie plus les dags dans la VM, ces informations seront passées par les volumes. Ensuite, je construis le fichier docker via docker build -t learning/airflow .. Mon docker-compose.yaml ressemble à ceci :

version: "3"

services:

  postgres:
    image: "postgres:9.6"
    container_name: "postgres"
    environment:
      - POSTGRES_USER=airflow
      - POSTGRES_PASSWORD=airflow
      - POSTGRES_DB=airflow
    ports:
    - "5432:5432"
    volumes:
    - ./data/postgres:/var/lib/postgresql/data

  initdb:
    image: learning/airflow
    entrypoint: airflow initdb
    depends_on:
      - postgres

  webserver:
    image: learning/airflow
    restart: always
    entrypoint: airflow webserver
    healthcheck:
      test: ["CMD-SHELL", "[ -f /opt/airflow/airflow-webserver.pid ]"]
      interval: 30s
      timeout: 30s
      retries: 3
    ports:
      - "8080:8080"
    depends_on:
      - postgres
    volumes:
    - ./airflow/dags:/opt/airflow/dags
    - ./airflow/plugins:/opt/airflow/plugins
    - ./data/logs:/opt/airflow/logs

  scheduler:
    image: learning/airflow
    restart: always
    entrypoint: airflow scheduler
    healthcheck:
      test: ["CMD-SHELL", "[ -f /opt/airflow/airflow-scheduler.pid ]"]
      interval: 30s
      timeout: 30s
      retries: 3
    depends_on:
      - postgres
    volumes:
      - ./airflow/dags:/opt/airflow/dags
      - ./airflow/plugins:/opt/airflow/plugins
      - ./data/logs:/opt/airflow/logs

Pour l'utiliser, exécutez d'abord docker-compose up postgres, puis docker-compose up initdb et ensuite docker-compose up webserver scheduler. C'est tout !

1voto

Alex Points 69

Créer deux conteneurs Docker individuellement pourrait ne pas atteindre votre objectif, car vous auriez besoin de communications entre les conteneurs. Vous pouvez configurer manuellement un réseau Docker entre vos conteneurs, bien que je n'ai pas essayé cette approche personnellement.

Une manière plus simple est d'utiliser docker-compose, dans lequel vous pouvez définir vos ressources dans un fichier yml, et laisser docker-compose les créer pour vous.

version: '2.1'
services:
    webserver:
        image: puckel/docker-airflow:1.10.4
        restart: always
        ...
    scheduler:
        image: puckel/docker-airflow:1.10.4
        restart: always
        depends_on:
            - webserver
        ...

Vous pouvez trouver le fichier complet ici

1voto

cricket_007 Points 6938

Note: votre question s'applique à tous les processus, pas seulement à Airflow

Ce n'est pas recommandé, bien sûr, mais vous pouvez trouver la documentation Docker sur superviseur qui surveille et exécute plusieurs processus sous un seul démon superviseur

https://docs.docker.com/config/containers/multi-service_container/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X