【问题标题】:Airflow DockerOperator, how to add a volume to a containerAirflow DockerOperator,如何将卷添加到容器中
【发布时间】:2021-08-03 13:25:09
【问题描述】:

我有一系列任务应该启动容器并在其中运行 python 脚本。 但是,我需要挂载包含 python 代码的卷...

在遇到许多错误后,我发现不再支持添加卷,现在必须指定一个 Mount 对象: https://github.com/apache/airflow/pull/15843

我的任务代码如下所示:

from airflow.operators.docker_operator import DockerOperator
from docker.types import Mount

code_dir = Mount(target='/SRC',
                     source='/SRC/code',
                     type='bind')

task_name = DockerOperator(
            task_id=f"task_{task_name}",
            image='python-multi-purpose:latest',
            container_name=task_name,
            mount=[code_dir],
            api_version='auto',
            auto_remove=True,
            command=command,
            docker_url="unix://var/run/docker.sock",
            network_mode="bridge",
            dag=dag
        )

不幸的是,我遇到了与使用 volumes=[list] 时收到的完全相同的错误:

airflow.exceptions.AirflowException: Invalid arguments were passed to DockerOperator (task_id: task_yh_get_info.A). Invalid arguments were:
**kwargs: {'mount': [{'Target': '/SRC', 'Source': '/SRC/code', 'Type': 'bind', 'ReadOnly': False}]}

谁能提供语法和如何使这项工作的逻辑解释?

或者,关于如何解决这个问题的任何建议?请记住,我让 Airflow 在容器内运行

谢谢!

【问题讨论】:

    标签: docker airflow docker-volume dockeroperator


    【解决方案1】:

    好的。另一个答案(如果你有最新的 docker 提供者):

    mount -> mounts.

    您的参数名称有错字:https://airflow.apache.org/docs/apache-airflow-providers-docker/stable/_api/airflow/providers/docker/operators/docker/index.html

    【讨论】:

    • 好的,所以当这种情况发生时,我总是告诉自己我需要休息一下,第二天再看看我的代码。但是我已经坚持了一个星期,所以我该怎么办!!!! :D
    • 非常感谢您的帮助。不幸的是,我遇到了新错误,但至少它现在正在尝试安装。
    【解决方案2】:

    我认为您遇到的主要问题是 Docker Provider 2.0.0 中存在一个错误,导致 Docker Operator 无法使用 Docker-In-Docker 解决方案运行。 2.1.0已经解决了

    您需要升级到最新的 Docker Provider 2.1.0 https://airflow.apache.org/docs/apache-airflow-providers-docker/stable/index.html#id1

    您可以按照https://airflow.apache.org/docs/docker-stack/build.html#extending-the-image 中的描述扩展图像来做到这一点 - 例如 - 这个 docker 文件:

    FROM apache/airflow
    RUN pip install --no-cache-dir apache-airflow-providers-docker==2.1.0
    

    在这种情况下,操作员将使用“回退”模式(和警告消息)开箱即用地工作,但您也可以禁用导致问题的挂载。更多解释来自https://airflow.apache.org/docs/apache-airflow-providers-docker/stable/_api/airflow/providers/docker/operators/docker/index.html

    但是,如果您必须记住,当您使用 docker-in-docker(和挂载 docker 套接字)时,“绑定”挂载的行为可能不是您所期望的。它实际上会将“主机”卷挂载到由 DockerOperator 运行的新容器,它不会将文件夹从一个容器挂载到另一个容器。但我相信这就是你想要做的——如果是这样的话,那么新版本的 Docker Provider 应该可以解决你的问题。

    另外 - 如果这仍然不能解决您的问题,您可以在“volume/mount”更改之前将 DockerOperator 降级到以前的版本。

    【讨论】:

    • 谢谢 Jarek,很遗憾我已经拥有最新版本的 apache-airflow-providers-docker。我可以尝试降级并使用“音量”,但是有一个错误导致它无法使用,因此我不确定它是否会起作用。
    • @Luke_V 我有一个类似的问题,使用此处描述的 pip 命令将软件包安装在 /root 目录中,默认安装使用 /home/airflow,一旦我更改它对我有用.
    • 谢谢@MCSH,我的问题实际上是错字……我知道我很难过……
    猜你喜欢
    • 2020-04-20
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2016-05-11
    相关资源
    最近更新 更多