Airflow DockerOperator,如何将卷添加到容器
Airflow DockerOperator, how to add a volume to a container
我有一系列任务应该启动容器和 运行 其中的 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 运行ning
谢谢!
我认为您遇到的主要问题是 Docker Provider 2.0.0 中存在一个错误,该错误阻止 Docker 操作员使用 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 的新版本应该可以解决您的问题。
此外 - 如果仍然不能解决您的问题,您可以随时将 DockerOperator 降级到“volume/mount”更改之前的先前版本。
好的。那么另一个答案(如果你有最新的 docker 供应商):
mount
-> mounts
.
我有一系列任务应该启动容器和 运行 其中的 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 运行ning
谢谢!
我认为您遇到的主要问题是 Docker Provider 2.0.0 中存在一个错误,该错误阻止 Docker 操作员使用 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 的新版本应该可以解决您的问题。
此外 - 如果仍然不能解决您的问题,您可以随时将 DockerOperator 降级到“volume/mount”更改之前的先前版本。
好的。那么另一个答案(如果你有最新的 docker 供应商):
mount
-> mounts
.