Docker部署Airflow示例DAG正常但自定义DAG失败且UI无日志
问题描述
采用Bitnami官方Docker镜像以多容器分离架构部署Airflow,当前运行的容器实例信息如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b02acfa97aa4 bitnami/airflow-worker:latest "/opt/bitnami/script…" 24 hours ago Up 5 hours 8793/tcp airflow-worker 6d3248484abf bitnami/airflow-scheduler:latest "/opt/bitnami/script…" 24 hours ago Up 5 hours airflow-scheduler a77104ebab02 bitnami/airflow:latest "/opt/bitnami/script…" 24 hours ago Up 5 hours 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp airflow e9240395fc51 bitnami/redis:latest "/opt/bitnami/script…" 24 hours ago Up 5 hours 6379/tcp redis e1aad6ab1ba1 bitnami/postgresql:latest "/opt/bitnami/script…" 24 hours ago Up 5 hours 5432/tcp postgresql
当前环境异常现象:
- 内置示例DAG可正常执行,Web UI可查看运行日志,
base_log_folder路径下可检索到对应日志文件 - 所有自定义DAG执行失败,Web UI无任何相关日志展示,
base_log_folder路径下也未生成自定义DAG的日志文件,无法定位失败根因
排查步骤(按问题命中概率排序)
1. 优先排查DAG解析阶段错误
这是自定义DAG失败且无任务日志的最高发原因:DAG如果在语法检查、依赖导入阶段就失败,根本不会进入任务调度执行流程,自然不会生成任务级别的运行日志
- 进入scheduler容器执行DAG列表扫描命令,直接抓取解析报错:
命令执行过程中输出的所有docker exec -it airflow-scheduler airflow dags listImportError、语法错误、权限错误都是根因,对应修复即可:- 语法问题:对照部署的Airflow版本支持的Python语法检查DAG代码,不要用高版本Python独有的语法编写DAG
- 依赖问题:自定义DAG用到的第三方Python包,必须同时安装在webserver、scheduler、worker三个容器内,缺任何一个节点的依赖都会导致解析或执行失败
- 路径问题:确认三个核心容器的
dags_folder配置指向同一份挂载的DAG目录,容器内运行Airflow的用户对DAG文件有可读权限
- 直接拉取scheduler最近的服务日志,筛选DAG解析相关报错:
所有DAG解析失败的栈信息都会打印在该日志中。docker logs airflow-scheduler --tail 200 | grep -E "ERROR|Failed to import|DagBag"
2. 检查日志配置与共享卷一致性
当前部署搭配Redis作为消息队列,默认使用CeleryExecutor架构,任务实际运行在worker节点,日志由worker生成,webserver需要读取共享存储里的日志才能在UI展示:
- 由于示例DAG日志可正常查看,说明基础日志配置大概率是通的,这一步直接拉取worker节点服务日志,搜索自定义DAG的ID,查看任务被worker拉取后是否抛出异常:
docker logs airflow-worker --tail 300 | grep "你的自定义DAG_ID" - 交叉验证三个节点的日志配置:分别在三个核心容器执行以下命令,确认返回的
base_log_folder路径完全一致,且路径对应的是三个容器共同挂载的共享卷,而非容器本地存储:# 分别替换容器名为airflow、airflow-scheduler、airflow-worker执行 docker exec -it <容器名> airflow config get-value logging base_log_folder
3. 检查DAG文件的属主与权限
Bitnami的Airflow镜像默认用UID为1001的非root用户运行服务,如果你挂载到容器里的自定义DAG文件是root用户创建、权限设置为600,容器内的服务进程会因为没有读权限解析DAG失败,且部分版本不会抛出明确的权限报错:
- 在宿主机的DAG挂载目录下执行以下命令修复权限:
修复后等待1-2分钟让scheduler重新扫描DAG目录,再触发DAG测试。# 替换为你实际的dags目录宿主机路径 chown -R 1001:1001 /path/to/your/dags/folder chmod -R 644 /path/to/your/dags/folder
4. 开启DEBUG日志抓取隐藏报错
如果以上步骤都没定位到问题,临时把三个核心容器的Airflow日志级别调整为DEBUG,重启容器后手动触发一次自定义DAG,分别查看scheduler和worker的服务日志,就能拿到完整的错误栈定位问题。
内容的提问来源于stack exchange,提问作者Venkat V
相关产品推荐
相关产品推荐

