Airflow: как запустить веб-сервер и планировщик вместе из изображения docker? - PullRequest
1 голос
/ 19 июня 2020

Я несколько неопытен как с Docker, так и с Airflow, так что это может быть глупый вопрос. У меня есть файл Dockerfile, который использует образ apache/airflow вместе с некоторыми из моих собственных DAG. Я хотел бы запустить веб-сервер воздушного потока вместе с планировщиком, и у меня с этим возникают проблемы. Я могу заставить его работать, но я чувствую, что подхожу к этому неправильно.

Вот как выглядит мой Dockerfile:

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

Затем я запускаю docker build -t learning/airflow .. Вот сложная часть: затем я запускаю docker run --rm -tp 8080:8080 learning/airflow:latest webserver, а в отдельном терминале - docker exec `docker ps -q` airflow scheduler. Проблема в том, что на практике это обычно происходит где-то на виртуальной машине, поэтому открытие второго терминала просто не вариант, и несколько машин, вероятно, не будут иметь доступа к одному и тому же контейнеру docker. Запуск webserver && scheduler, похоже, не работает, сервер, похоже, блокирует, и я все еще вижу сообщение «Планировщик не работает» в пользовательском интерфейсе Airflow.

Есть идеи о том, что правильно способ запуска сервера и планировщика должен быть?

Большое спасибо!

Ответы [ 3 ]

1 голос
/ 20 июня 2020

Примечание: ваш вопрос относится к любым процессам, а не только к Airflow

Это, конечно, не рекомендуется, но вы можете найти документацию Docker на supervisor, которая отслеживает и запускает несколько процессов под одним supervisord демон

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

1 голос
/ 20 июня 2020

Во-первых, спасибо @Alex и @abestrad за предложение docker -compose здесь - я думаю, что это лучшее решение. Мне наконец удалось заставить его работать, сославшись на этот замечательный пост . Итак, вот мое решение:

Во-первых, мой Dockerfile теперь выглядит так:

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

Обратите внимание, что я больше не копирую даги на виртуальную машину, эта информация будет передана через тома. Затем я создаю файл docker через docker build -t learning/airflow .. Мой docker-compose.yaml выглядит так:

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

Чтобы использовать его, сначала запустите docker-compose up postgres, затем docker-compose up initdb, а затем docker-compose up webserver scheduler. Вот и все!

1 голос
/ 20 июня 2020
Само по себе

раскручивание двух docker контейнеров может не достичь вашей цели, так как вам потребуется связь между контейнерами. Вы можете вручную настроить docker сеть между вашими контейнерами, хотя я лично не пробовал этот подход.

Более простой способ - использовать docker-compose, который вы можете определить ваши ресурсы в файле yml и позвольте docker -compose создать их для вас.

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
        ...

Вы можете найти полный файл здесь

...