0

我有一系列任务应该启动容器并在其中运行 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 在容器内运行

谢谢!

4

2 回答 2

1

我认为您遇到的主要问题是 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 降级到以前的版本。

于 2021-08-04T18:43:23.253 回答
1

好的。那么另一个答案(如果您有最新的 docker 提供商):

mount-> mounts

您在参数名称中有拼写错误:https ://airflow.apache.org/docs/apache-airflow-providers-docker/stable/_api/airflow/providers/docker/operators/docker/index.html

于 2021-08-05T16:19:46.633 回答