Apache Airflow中File Sensor无法触发问题求助
Docker部署Airflow中FileSensor无法检测文件的解决方案
核心问题
你遇到的问题本质是Docker容器与本地主机的文件系统隔离:
- PythonOperator在Airflow容器内创建文件,默认路径是容器内部的工作目录(如
/opt/airflow),本地主机无法直接访问; - 直接使用本地绝对路径(如
c:\test\my_file.txt)时,容器内不存在这个路径,所以触发"No such file"错误。
具体解决步骤
1. 配置Docker共享卷
修改Airflow的docker-compose.yml,将本地目录挂载到容器内的固定路径,实现文件同步。以Windows为例,添加以下卷配置:
volumes: - ./dags:/opt/airflow/dags - ./logs:/opt/airflow/logs - ./plugins:/opt/airflow/plugins - c:/test:/opt/airflow/shared_files # 本地c:\test目录挂载到容器内/opt/airflow/shared_files
修改后重启Airflow容器,确保卷挂载生效。
2. 统一使用容器内路径
调整DAG代码,让PythonOperator和FileSensor都使用容器内的挂载路径:
from airflow import DAG from airflow.operators.python import PythonOperator from airflow.sensors.filesystem import FileSensor from datetime import datetime def create_file(): # 写入容器内的共享路径 with open('/opt/airflow/shared_files/my_file.txt', 'w') as f: f.write('test content') with DAG( 'file_sensor_dag', start_date=datetime(2024, 1, 1), schedule_interval=None, catchup=False ) as dag: create_file_task = PythonOperator( task_id='create_my_file', python_callable=create_file ) check_file_sensor = FileSensor( task_id='check_file_exists', filepath='/opt/airflow/shared_files/my_file.txt', fs_conn_id='fs_default', poke_interval=3, # 缩短检测间隔,方便测试 timeout=30 ) create_file_task >> check_file_sensor
3. 验证fs_default连接
进入Airflow管理控制台,确认fs_default连接的配置:
- 连接类型选择
File (path); Extra字段留空即可(无需额外配置,默认使用容器内的文件系统)。
关键注意事项
- Windows系统下,Docker挂载路径要使用正斜杠
/,避免反斜杠\的转义问题; - 不要在Operator中混用本地路径和容器路径,所有文件操作必须统一使用容器内的挂载路径;
- 测试前可以进入Airflow容器(
docker exec -it <airflow-worker-container-name> bash),手动检查路径是否存在、文件是否生成。
内容的提问来源于stack exchange,提问作者Robert C. Fountain
相关产品推荐
相关产品推荐

