如何使用Apache Airflow中的Docker Operator卷

2024-09-29 17:23:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个ETL过程,使用DockerOperator与Apache Airflow一起计划和协调。我在Windows笔记本电脑上工作,所以我只能在docker容器中运行Apache Airflow。我能够使用位于我的项目根目录中的以下docker-compose.yml文件中指定的卷,将windows笔记本电脑上带有配置文件(下面称为configs)的文件夹装入airflow容器(下面称为webserver)。下面可以看到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文件夹及其所有内容传递给DockerRoperator创建的容器。尽管此configs文件夹显然已装入Web服务器容器的文件系统,但此configs文件夹完全为空,因此,我的DAG失败。DockerRoperator的代码如下所示:

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"
        )

根据文档,卷的左侧必须是主机上的绝对路径,如果我理解正确的话,它就是本例中的webserver容器(因为它为每个任务创建单独的容器)。卷的右侧是DockerRoperator创建的任务容器内的目录。如上所述,任务容器中的configs文件夹确实存在,但完全为空。有人知道为什么会这样以及如何解决吗

非常感谢你的帮助


Tags: thecomposedockername文件夹apachecontainer容器
2条回答

在实现来自here的建议后,需要按如下方式指定DockerPropertor构造函数中的卷:

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=['/c/Users/kevin/dev/myproject/app/configs:/app/configs']  # "absolute_path_host:absolute_path_container"
        )

也许文件路径需要这样,因为Docker在Windows上的VM中运行

正如@sarnu还提到的,重要的是要理解,主机端路径是我的windows笔记本电脑上的路径,因为为每个任务创建的容器并行运行/是气流容器的同级容器

在这种情况下,由airflow docker操作员启动的容器与airflow容器“平行”运行,由主机上的docker服务监督。
docker operator调用中声明的所有卷必须是主机上的绝对路径。
docker compose中的卷定义有些特殊,在这种情况下允许相对路径

相关问题 更多 >

    热门问题