You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 12:06:21