Docker部署Airflow时任务读取文件报路径不存在问题咨询
问题核心原因
你遇到的文件找不到问题本质是Docker容器的文件系统隔离特性:
- 官方Airflow Docker镜像默认的
AIRFLOW_HOME路径是容器内部的/opt/airflow,和你宿主机上的/home/airflow/example不是同一个文件系统 - 只有你在
docker-compose.yaml里通过volumes配置显式挂载的宿主机目录,才能在容器内部被访问到 - 你之前用相对路径
./dags/data/example.pkl读文件的写法本身就不可靠:Airflow执行任务时的工作目录不固定,随执行器、运行用户变化,相对路径很容易指向错误位置。
第一步:先确认挂载配置
先打开你宿主机上的docker-compose.yaml,找到服务的volumes配置段,默认官方配置会挂载三个核心目录:
volumes: - ./dags:/opt/airflow/dags - ./logs:/opt/airflow/logs - ./plugins:/opt/airflow/plugins
按照你贴的本地目录结构,data文件夹是放在dags目录下的,如果上述挂载配置正确,容器内部理论上存在/opt/airflow/dags/data/example.pkl这个文件。如果读不到,先执行以下命令重启容器让挂载同步生效(改完目录结构不重启容器经常会出现文件不同步的问题):
docker-compose down docker-compose up -d
正确的文件读取实现
方案1:基于DAG文件路径拼接(最通用,不依赖环境变量)
不要依赖AIRFLOW_HOME环境变量,直接通过当前DAG文件的位置拼绝对路径,只要DAG文件和data目录的相对位置不变,不管部署环境怎么变都能正常读取:
import os import pandas as pd def read_data(**kwargs): # __file__ 对应当前运行的example_airflow.py文件的路径 current_dag_dir = os.path.abspath(os.path.dirname(__file__)) file_path = os.path.join(current_dag_dir, "data", "example.pkl") df = pd.read_pickle(file_path) kwargs['ti'].xcom_push(key='df', value=df)
方案2:单独挂载数据目录(适合数据文件较大、不放在dags目录的场景)
如果不想把数据文件放在dags目录下,可以在docker-compose.yaml里新增一条volume挂载,把你本地的数据目录映射到容器内固定路径:
volumes: - ./dags:/opt/airflow/dags - ./logs:/opt/airflow/logs - ./plugins:/opt/airflow/plugins # 新增:本地data目录映射到容器内/opt/airflow/data - ./dags/data:/opt/airflow/data
重启容器生效后,直接用容器内绝对路径读取即可:
def read_data(**kwargs): import pandas as pd df = pd.read_pickle("/opt/airflow/data/example.pkl") kwargs['ti'].xcom_push(key='df', value=df)
注意:Xcom默认存储在Airflow元数据库中,默认支持的序列化单条数据大小上限为64KB,不适合传输pandas DataFrame这类大对象,后续处理大文件建议直接在对应任务内读取文件路径,不要通过Xcom传递。
内容的提问来源于stack exchange,提问作者Jero
相关产品推荐
相关产品推荐

