Docker Compose中Airflow WebServer无法识别Scheduler问题求助
问题排查与解决方案
1. 修正Postgres端口与数据库连接配置
你的Postgres容器端口映射错误,默认Postgres端口是5432,但配置中写成了"5431:5431",导致Airflow服务无法连接数据库。同时Webserver和Scheduler缺少明确的数据库连接配置:
- 修改Postgres的ports为:
"5431:5432"(宿主机5431映射容器内默认5432端口) - 在webserver和scheduler的
environment中添加数据库连接变量:- AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres:5432/airflow
2. 添加Airflow初始化步骤
Airflow首次启动需要初始化数据库表结构、创建管理员用户,当前配置缺少这一步:
在docker-compose.yml的services中新增初始化服务:
init: image: jh111/airflow-hadoop-spark:test environment: - AIRFLOW_HOME=/home/airflow - AIRFLOW__CORE__LOAD_EXAMPLES=False - AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres:5432/airflow depends_on: - postgres command: bash -c "airflow db init && airflow users create --username admin --password admin --firstname Admin --lastname User --role Admin --email admin@example.com"
启动时先执行docker-compose run init完成初始化,再启动其他服务。
3. 移除无效的Scheduler配置
Scheduler配置中的AIRFLOW_WEBSERVER_HOST=webserver并非Airflow标准配置,Scheduler依赖数据库同步状态而非直接连接Webserver,直接删除该环境变量。
4. 检查DAG文件夹权限
挂载的DAG文件夹可能存在权限问题,导致Airflow无法读取文件:
- 进入容器查看权限:
docker-compose exec webserver ls -l /home/airflow/dags - 若权限不足,修改宿主机DAG文件夹权限:
chmod -R 755 ../dags
5. 重启服务验证
完成上述修改后执行以下步骤:
- 停止所有服务:
docker-compose down - 执行初始化:
docker-compose run init - 启动服务:
docker-compose up -d - 查看Scheduler日志确认运行状态:
docker-compose logs scheduler - 查看Webserver日志:
docker-compose logs webserver
修正后的完整docker-compose.yml
version: "3.7" services: postgres: image: "postgres:13" container_name: "postgres" environment: - POSTGRES_USER=airflow - POSTGRES_PASSWORD=airflow - POSTGRES_DB=airflow ports: - "5431:5432" volumes: - ./data/postgres:/var/lib/postgresql/data init: image: jh111/airflow-hadoop-spark:test environment: - AIRFLOW_HOME=/home/airflow - AIRFLOW__CORE__LOAD_EXAMPLES=False - AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres:5432/airflow depends_on: - postgres command: bash -c "airflow db init && airflow users create --username admin --password admin --firstname Admin --lastname User --role Admin --email admin@example.com" webserver: image: jh111/airflow-hadoop-spark:test restart: always networks: - default_net environment: - AIRFLOW_HOME=/home/airflow - AIRFLOW__CORE__LOAD_EXAMPLES=False - AIRFLOW__CORE__dags_folder=/home/airflow/dags - AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres:5432/airflow volumes: - ../dags:/home/airflow/dags #DAG folder ports: - "7777:7777" depends_on: - postgres command: bash -c "airflow webserver --port 7777" scheduler: image: jh111/airflow-hadoop-spark:test restart: always networks: - default_net environment: - AIRFLOW_HOME=/home/airflow - AIRFLOW__CORE__LOAD_EXAMPLES=False - AIRFLOW__CORE__dags_folder=/home/airflow/dags - AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres:5432/airflow volumes: - ../dags:/home/airflow/dags #DAG folder depends_on: - postgres command: bash -c "airflow scheduler" networks: default_net:
内容的提问来源于stack exchange,提问作者alryosha
相关产品推荐
相关产品推荐

