Docker部署Apache Airflow后Web服务报Broken DAG错误求修复
问题修复方案
问题根源
你使用的puckel/docker-airflow:latest是Airflow 1.x版本的镜像,但本地VS Code安装的是Airflow 2.x——两者的Python Operator导入路径存在差异:
- Airflow 2.x写法:
from airflow.operators.python import PythonOperator - Airflow 1.x写法:
from airflow.operators.python_operator import PythonOperator
Docker容器内的Airflow 1.x无法识别2.x的导入路径,因此触发了Broken DAG错误。
修复方案二选一:
方案1:修改DAG代码适配Airflow 1.x
将DAG文件中的导入语句替换为1.x版本的格式:
# 替换原有导入行 from airflow.operators.python_operator import PythonOperator
方案2:替换为Airflow 2.x官方镜像(推荐)
puckel的镜像已停止维护,建议改用官方维护的Airflow 2.x镜像,调整你的docker-compose.yml如下:
- 把所有服务的
image: puckel/docker-airflow:latest替换为apache/airflow:2.x.y(例如apache/airflow:2.8.0,选择稳定版本即可) - 适配Airflow 2.x的默认工作目录(
/opt/airflow,原镜像为/usr/local/airflow) - 修正环境变量、服务依赖和命令逻辑,调整后的完整配置示例:
version: '3.8' services: redis: image: 'redis:latest' postgres: image: postgres:14.0 environment: - POSTGRES_USER=airflow - POSTGRES_PASSWORD=airflow - POSTGRES_DB=airflow volumes: - postgres-db-volume:/var/lib/postgresql/data webserver: image: apache/airflow:2.8.0 restart: always depends_on: - postgres - redis - scheduler environment: - AIRFLOW__CORE__EXECUTOR=CeleryExecutor - AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres/airflow - AIRFLOW__CELERY__RESULT_BACKEND=db+postgresql://airflow:airflow@postgres/airflow - AIRFLOW__CELERY__BROKER_URL=redis://:@redis:6379/0 - AIRFLOW__CORE__FERNET_KEY=46BKJoQYlPPOexq0OhDZnIlNepKFf87WFwLbfzqDDho= - AIRFLOW__CORE__LOAD_EXAMPLES=False volumes: - ./dags:/opt/airflow/dags - ./logs:/opt/airflow/logs - ./plugins:/opt/airflow/plugins ports: - "8080:8080" command: webserver healthcheck: test: ["CMD-SHELL", "[ -f /opt/airflow/airflow-webserver.pid ]"] interval: 30s timeout: 30s retries: 3 flower: image: apache/airflow:2.8.0 restart: always depends_on: - redis environment: - AIRFLOW__CELERY__BROKER_URL=redis://:@redis:6379/0 ports: - "5555:5555" command: celery flower scheduler: image: apache/airflow:2.8.0 restart: always depends_on: - postgres - redis volumes: - ./dags:/opt/airflow/dags - ./logs:/opt/airflow/logs - ./plugins:/opt/airflow/plugins environment: - AIRFLOW__CORE__EXECUTOR=CeleryExecutor - AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres/airflow - AIRFLOW__CELERY__RESULT_BACKEND=db+postgresql://airflow:airflow@postgres/airflow - AIRFLOW__CELERY__BROKER_URL=redis://:@redis:6379/0 - AIRFLOW__CORE__FERNET_KEY=46BKJoQYlPPOexq0OhDZnIlNepKFf87WFwLbfzqDDho= - AIRFLOW__CORE__LOAD_EXAMPLES=False command: scheduler worker: image: apache/airflow:2.8.0 restart: always depends_on: - scheduler - redis volumes: - ./dags:/opt/airflow/dags - ./logs:/opt/airflow/logs - ./plugins:/opt/airflow/plugins environment: - AIRFLOW__CORE__EXECUTOR=CeleryExecutor - AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres/airflow - AIRFLOW__CELERY__RESULT_BACKEND=db+postgresql://airflow:airflow@postgres/airflow - AIRFLOW__CELERY__BROKER_URL=redis://:@redis:6379/0 - AIRFLOW__CORE__FERNET_KEY=46BKJoQYlPPOexq0OhDZnIlNepKFf87WFwLbfzqDDho= command: celery worker volumes: postgres-db-volume:
调整后执行以下命令重启服务:
# 停止现有服务 docker-compose down # 初始化Airflow数据库(首次运行需执行) docker-compose run --rm webserver airflow db init # 创建管理员用户(首次运行需执行) docker-compose run --rm webserver airflow users create --username admin --password admin --firstname Admin --lastname User --role Admin --email admin@example.com # 启动所有服务 docker-compose up -d
注意事项
- 方案2是长期维护的最优选择,官方镜像持续更新,功能更完善
- 切换镜像后建议清理旧容器和卷,避免遗留配置冲突
- 本地VS Code的Airflow版本建议与Docker内版本保持一致,减少后续代码兼容性问题
内容的提问来源于stack exchange,提问作者Sơn Bùi
相关产品推荐
相关产品推荐

