9

我的 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 集群内工作?还是我只是在语法中遗漏了什么?

4

5 回答 5

8

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

然而,要让 DockerOperator 正常工作需要更多的努力,因为作曲家工作人员无法访问 Docker 守护程序。前往 GCP 控制台并执行以下步骤;获得集群凭据后)。

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

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

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

  3. 应用部署设置

    kubectl apply -f airflow-worker-config.yaml

于 2018-06-08T02:35:51.193 回答
5

这意味着:无论您的 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软件包版本错误有关。

于 2018-05-09T12:13:55.457 回答
1

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

警告:默认情况下,DockerOperator将尝试与 Docker API 对话以/var/run/docker.sock管理容器。此套接字安装在 Composer Airflow 工作程序 pod 内,因此不建议手动配置它。只有在配置为与在您的环境之外运行的 Docker 守护进程通信时,才建议在 Composer 中使用DockerOperator

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

于 2020-08-15T17:04:53.010 回答
0

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

于 2018-05-09T19:26:22.133 回答
0

在我的案例中解决问题的方法是在 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' \
于 2020-12-27T02:17:17.880 回答