Docker部署Airflow时从其他容器运行Papermill触发notebook服务笔记本的问题
触发notebook服务中笔记本文件的操作步骤
基于你提供的docker-compose配置,完整操作流程如下:
步骤1:调整共享目录配置
你当前的配置里Airflow和notebook服务没有共享笔记本文件存储目录,首先修改x-airflow-common下的volumes配置,新增共享目录映射:
volumes: - ./dags:/opt/airflow/dags - ./logs:/opt/airflow/logs - ./plugins:/opt/airflow/plugins # 新增这一行,和notebook服务挂载同一个本地work目录 - ./work:/opt/airflow/work
修改后重启Airflow相关服务生效:docker-compose up -d --build
步骤2:编写调用笔记本的DAG文件
在本地./dags目录下新建Python文件(比如run_notebook_dag.py),使用已安装的PapermillOperator定义任务,示例代码如下:
from datetime import datetime, timedelta from airflow import DAG from airflow_provider_papermill.operators.papermill import PapermillOperator default_args = { 'owner': 'airflow', 'retries': 1, 'retry_delay': timedelta(minutes=5) } with DAG( dag_id='run_jupyter_notebook', default_args=default_args, description='触发notebook服务中的笔记本文件', schedule_interval=None, # 按需设置定时规则,设为None仅支持手动触发 start_date=datetime(2024, 1, 1), catchup=False, tags=['notebook', 'papermill'] ) as dag: run_notebook_task = PapermillOperator( task_id='run_sample_notebook', # 输入的笔记本路径,对应notebook服务里的/home/jovyan/work/sample.ipynb input_nb='/opt/airflow/work/sample.ipynb', # 执行后的输出笔记本路径,带时间戳避免覆盖历史文件 output_nb=f'/opt/airflow/work/executed_notebook_{{{{ execution_date }}}}.ipynb', # 可以传入笔记本需要的参数,按需填写即可 parameters={ 'param1': 'value1', 'param2': 100 }, kernel_name='python3' )
你需要把input_nb的值替换为实际要运行的笔记本文件路径。
步骤3:触发执行
- 等待Airflow Scheduler加载DAG后,访问Airflow WebUI:
http://localhost:8080,默认账号密码为airflow/airflow - 在DAG列表中找到
run_jupyter_notebook,点击DAG名称进入详情页 - 打开DAG的启用开关,点击右上角的「触发DAG」按钮即可启动执行
- 执行完成后,你可以在notebook服务的
/home/jovyan/work目录下找到带完整执行结果的输出笔记本文件
注意事项
- 提前给本地
./work目录设置读写权限,避免Airflow和notebook服务读写文件时报错:chmod 777 ./work - 若笔记本需要额外依赖,你可以直接在notebook服务中安装,或者打包到Airflow的镜像中,保证两边执行环境一致。
内容的提问来源于stack exchange,提问作者Benj Cabalona Jr.
相关产品推荐
相关产品推荐

