【问题标题】:Broken DAG: (...) No module named docker损坏的 DAG:(...)没有名为 docker 的模块
【发布时间】:2018-05-09 12:11:14
【问题描述】:

我的 BigQuery 连接器都在运行,但我希望在 Cloud Composer 而不是 App Engine Flexible 上安排在 Docker 容器中的一些现有脚本。

我有以下脚本,似乎遵循我能找到的示例:

import datetime
from airflow import DAG
from airflow import models
from airflow.operators.docker_operator import DockerOperator

yesterday = datetime.datetime.combine(
    datetime.datetime.today() - datetime.timedelta(1),
    datetime.datetime.min.time())

default_args = {
    # Setting start date as yesterday starts the DAG immediately
    'start_date': yesterday,
    # If a task fails, retry it once after waiting at least 5 minutes
    'retries': 1,
    'retry_delay': datetime.timedelta(minutes=5),
}

schedule_interval = '45 09 * * *'

dag = DAG('xxx-merge', default_args=default_args, schedule_interval=schedule_interval)

hfan = DockerOperator(
   task_id = 'hfan',
   image   = 'gcr.io/yyyyy/xxxx'
 )

...但是在尝试运行时它会在 Web UI 中告诉我:

Broken DAG: [/home/airflow/gcs/dags/xxxx.py] No module named docker

可能是 Docker 未配置为在 Cloud Composer 运行的 Kubernetes 集群内工作?还是我只是在语法中遗漏了什么?

【问题讨论】:

标签: docker airflow directed-acyclic-graphs google-cloud-composer


【解决方案1】:

我通过在 composer 的 PyPI 部分安装 docker-py==1.10.6 解决了这个问题。

但是,要让 DockerOperator 正常工作需要付出更多的努力,因为作曲家工作人员无法访问 Docker 守护程序。前往 GCP 控制台并执行以下步骤;得到cluster credentials后)。

  1. 将当前部署配置导出到文件

    kubectl get deployment airflow-worker -o yaml --export > airflow-worker-config.yaml

  2. 编辑airflow-worker-config.yaml (example link) 以挂载docker.sock 和docker,授予airflow-worker 特权访问以运行docker 命令

  3. 应用部署设置

    kubectl apply -f airflow-worker-config.yaml

【讨论】:

  • 对于新读者,不建议重新配置:stackoverflow.com/a/63428706/1380918。如果您更新或升级您的环境,也无法保证airflow-worker 的补丁将持续存在。将GKEPodOperator 视为启动容器的推荐解决方案。
【解决方案2】:

这意味着:无论您的 Airflow 实例安装在何处,都缺少名为 docker 的 Python 包。

如果我配置我的个人机器,我可以安装缺少的软件包

pip install docker

编辑

docker组件的源代码内https://airflow.incubator.apache.org/_modules/airflow/operators/docker_operator.html

有一个import语句:

from docker import Client, tls

因此,在我看来,新错误 cannot import name Client 似乎与安装损坏或 docker 软件包的错误版本有关。

【讨论】:

  • 啊,好吧,所以我应该在 PyPi 部分安装它!现在就试试,谢谢!
  • 嗯,很接近,但现在安装 docker 后我得到Broken DAG: [...] cannot import name Client - 这是同一件事还是不同的问题?
  • 非常感谢 - 我将尝试使用新的 docker 版本和环境
  • 是否应该安装pip install docker-py? (不,它来自 2016 年 pypi.org/project/docker-py
【解决方案3】:

如其他答案中所述,Docker Python 客户端未预安装在 Cloud Composer 环境中。要安装它,请将其添加为环境配置中的 PyPI 依赖项。

警告:默认情况下,DockerOperator 将尝试与/var/run/docker.sock 的 Docker API 通信以管理容器。此套接字安装在 Composer Airflow 工作容器中,不推荐手动配置它。 Use of DockerOperator is only recommended in Composer if configured to talk to Docker daemons running outside of your environments.

为了避免更脆弱的配置或绕过 Kubernetes 带来的意外(因为它负责管理整个集群中的容器),您应该使用KubernetesPodOperator。如果您要将容器启动到 GKE 集群(或 Composer 环境的集群)中,则可以使用 GKEPodOperator,它具有更具体的 GCP 相关参数。

【讨论】:

  • 同意,这就是我最终的结果
【解决方案4】:

如 tobi6 的回答中所述,您需要在 Composer 环境中安装用于 docker 的 PyPI 包。有说明 here 在您的环境中以特定包版本安装 PyPI 包。

【讨论】:

    【解决方案5】:

    解决我的问题的方法是在 Dockerfile 中添加单词“docker”

    && pip install pyasn1 \
    && pip install apache-airflow[crypto,docker,celery,postgres,hive,jdbc,mysql,ssh${AIRFLOW_DEPS:+,}${AIRFLOW_DEPS}]==${AIRFLOW_VERSION} \
    && pip install 'redis==3.2' \
    

    【讨论】:

      猜你喜欢
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-03
      • 1970-01-01
      相关资源
      最近更新 更多