如何理解Airflow容器的“unhealthy”状态及相关部署故障排查
问题根因分析
- 你使用的
apache-airflow-providers-docker==1.2.0版本存在已知的Docker挂载泄露问题:该版本的DockerOperator执行任务后不会主动清理临时挂载的目录/卷,随着运行次数增加会产生大量僵尸挂载点,导致Docker守护进程响应阻塞,最终出现访问/dags目录无响应、容器健康检查超时的问题 - Airflow 2.1.0自带的docker-compose配置默认开启了DAG目录的文件监听轮询,在Windows/macOS环境下使用Docker Desktop的共享文件系统挂载时,容易触发文件系统缓存死锁,导致DAG更新不生效、目录访问卡死
- 第二次执行
docker-compose up airflow-init卡死是因为首次运行后产生的残留元数据、未清理的临时挂载和锁文件没有被清除,init进程无法获取对应资源的操作权限
解决方案
1. 修复版本兼容问题
更新你的自定义Dockerfile,替换有bug的provider版本:
FROM apache/airflow:2.1.0 # 升级到无挂载泄露bug的最低稳定版本 RUN pip install apache-airflow-providers-docker==2.1.0
如果可以接受升级Airflow核心版本,建议直接升级到2.2.5以上的LTS版本,能同时规避大量已知的docker-compose部署bug。
2. 调整docker-compose.yml配置
打开你使用的官方docker-compose.yml文件,修改以下参数:
- 在
x-airflow-common的environment节点下添加配置关闭不必要的文件监听:AIRFLOW__SCHEDULER__DAG_DIR_LIST_INTERVAL: 30 AIRFLOW__SCHEDULER__DAG_DIR_LIST_REQUEST_TIMEOUT: 60 AIRFLOW__CORE__DAG_FILE_PROCESSOR_TIMEOUT: 120 # 关闭文件变更监听,改用定时扫描,避免共享文件系统死锁 AIRFLOW__CORE__DAG_DISCOVERY_SAFE_MODE: "False" - 检查dags目录的挂载配置,确保你本地的dags目录权限设置为755,避免权限不足导致的扫描卡死。
3. 清理残留资源后重新启动
执行以下命令清理所有残留资源,避免重启后残留问题复现:
# 停止所有运行中的Airflow容器并删除挂载卷 docker-compose down -v # 清理Docker僵尸挂载和临时资源 docker system prune -f # 重新构建自定义镜像 docker-compose build # 执行初始化 docker-compose up airflow-init # 后台启动所有服务 docker-compose up -d
4. 临时应急修复(无需重启Docker)
如果后续再出现/dags目录无响应、容器unhealthy的情况,不需要重启整个Docker,执行以下命令即可恢复:
docker restart $(docker ps -q --filter "name=airflow") docker system prune --volumes -f
内容的提问来源于stack exchange,提问作者MStikh
相关产品推荐
相关产品推荐

