Как использовать объем с Docker Оператор от Apache Воздушный поток - PullRequest
0 голосов
/ 29 января 2020

Я разрабатываю процесс ETL, который планируется и организуется с помощью Apache Воздушный поток с использованием DockerOperator. Я работаю на Windows ноутбуке, поэтому я могу запускать Apache Airflow только из контейнера docker Мне удалось смонтировать папку на моем windows ноутбуке с файлами конфигурации (называемой configs ниже) в контейнер воздушного потока (называемый ниже веб-сервером), используя том, указанный в файле docker-compose.yml ниже, который находится в моем проекте root каталог. Соответствующий код из файла docker-compose.yml можно увидеть ниже:

version: '2.1'
    webserver:
        build: ./docker-airflow
        restart: always
        privileged: true
        depends_on:
            - mongo
            - mongo-express
        environment:
            - LOAD_EX=n
            - EXECUTOR=Local
        volumes:
            - ./docker-airflow/dags:/usr/local/airflow/dags
            # Volume for source code
            - ./src:/src
            - ./docker-airflow/workdir:/home/workdir
            # configs folder as volume
            - ./configs:/configs
            # Mount the docker socket from the host (currently my laptop) into the webserver container so that the webserver container can create "sibbling" containers
            - //var/run/docker.sock:/var/run/docker.sock  # the two "//" are needed for windows OS
        ports:
            - 8081:8080
        command: webserver
        healthcheck:
            test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"]
            interval: 30s
            timeout: 30s
            retries: 3
        networks:
            - mynet

Теперь я хочу передать эту папку configs со всем ее содержимым в контейнеры, созданные DockerOperator. Хотя эта папка configs была явно подключена к файловой системе контейнера веб-сервера, эта папка configs полностью пуста, и из-за этого мой DAG не работает. Код для DockerOperator выглядит следующим образом:

cmd = "--config_filepath {} --data_object_name {}".format("/configs/dev.ini", some_data_object)
        staging_op = DockerOperator(
            command=cmd,
            task_id="my_task",
            image="{}/{}:{}".format(docker_hub_username, docker_hub_repo_name, image_name),
            api_version="auto",
            auto_remove=False,
            network_mode=docker_network,
            force_pull=True,
            volumes=["/configs:/configs"]  # "absolute_path_host:absolute_path_container"
        )

Согласно документации, левая сторона тома должна быть абсолютным путем к хосту, который (если я правильно понял) является контейнером веб-сервера в этот случай (потому что он создает отдельные контейнеры для каждой задачи). Правая сторона тома - это каталог внутри контейнера задачи, который создается DockerOperator. Как упоминалось выше, папка configs внутри контейнера задачи существует, но она полностью пуста. Кто-нибудь знает, почему это так и как это исправить?

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

1 Ответ

0 голосов
/ 09 марта 2020

В этом случае контейнер запускается из потока воздушного потока docker оператор работает «параллельно» контейнеру воздушного потока, контролируемого службой docker на вашем хосте.
Все тома, объявленные в вызове оператора docker должны быть абсолютными путями на вашем хосте.
Определения томов в docker -compose являются несколько особыми, в этом случае разрешены относительные пути.

...