Input
具有参数DockerOperator
,该参数设置后会将Docker容器的输出推送到Xcom:
xcom_push
在Xcom的管理界面中,我可以通过键t1 = DockerOperator(task_id='run-hello-world-container',
image='hello-world',
xcom_push=True, xcom_all=True,
dag=dag)
看到这些值。但是,如何在DAG中访问它们?
如果我尝试:
return_value
我得到t1_email_output = EmailOperator(task_id='t1_email_output',
to='user@example.com',
subject='Airflow sent you an email!',
html_content={{ ti.xcom_pull(task_ids='return_value') }},
dag=dag)
。
如果我尝试:
Broken DAG: [PATH] name 'ti' is not defined
我得到t1_email_output = EmailOperator(task_id='t1_email_output',
to='user@example.com',
subject='Airflow sent you an email!',
html_content=t1.xcom_pull(task_ids='return_value'),
dag=dag)
。
答案 0 :(得分:0)
您需要传递要从中提取xcom的任务ID,而不是变量名 在您的示例中,将是
{{ ti.xcom_pull('run-hello-world-container') }}
在第二个代码段中也应为“ ti” ,而不是“ t1”
html_content=ti.xcom_pull('run-hello-world-container'),
答案 1 :(得分:0)
我发现了问题-原来我缺少引号,而且我的参数也有误:
t1_email_output = EmailOperator(task_id='t1_email_output',
to='user@example.com',
subject='Airflow sent you an email!',
html_content="{{ ti.xcom_pull(key='return_value') }}",
dag=dag)
发送一封包含Docker容器输出的电子邮件,就像我期望的那样。
我认为正在发生的事情是,在运行DAG时,Airflow将{{ }}
语法作为Jinja模板进行处理,但在加载时却没有。因此,如果我不加引号,则Airflow在尝试检测和加载DAG时会得到Python异常,因为模板尚未呈现。但是,如果添加引号,则模板化表达式将被视为字符串,并在由Airflow加载时被Python解释器忽略。但是,当EmailOperator
在DAG运行期间实际上被触发时,该模板将呈现为对相关数据的实际引用。