使用Docker Compose部署Airflow连接Postgres容器时遇连接拒绝错误
Airflow容器连接Postgres容器失败的解决方法
问题核心原因
你遇到的psycopg2.OperationalError: Connection refused本质是容器网络中localhost的概念混淆:
- Postgres容器内的
localhost指向容器自身,所以手动进入容器能正常连接Postgres服务; - 但Airflow容器内的
localhost仅指向Airflow容器本身,而非Postgres容器,因此连接localhost:5432会被拒绝。
从容器状态来看,Postgres容器仅在Docker内部网络暴露5432端口(5432/tcp),这不是问题——Airflow和Postgres在同一Docker网络下,不需要宿主机端口映射,直接通过容器服务名即可访问。
解决步骤
1. 修改Airflow的Postgres连接配置
将Airflow中Postgres连接的host字段从localhost替换为Postgres容器的服务名(或容器名):
- 你的Postgres容器名为
postgres-1,对应Docker Compose中的服务名通常是postgres,因此主机地址填写postgres即可; - 示例连接字符串修改:
你可以在Airflow UI的「Admin > Connections」中修改对应连接的Host值,或检查DAG代码、环境变量中的连接配置。# 原错误配置 postgresql://airflow:airflow@localhost:5432/airflow # 修改后正确配置 postgresql://airflow:airflow@postgres:5432/airflow
2. 验证网络连通性
进入任意Airflow容器(如webserver),测试与Postgres容器的连通性:
# 测试ping连通性 docker exec -it airflow-webserver-1 ping postgres # 直接用psql测试连接 docker exec -it airflow-webserver-1 psql -h postgres -U airflow -p 5432
若能成功连接,说明配置修改正确。
额外检查(可选)
确保Docker Compose中Airflow和Postgres服务处于同一网络下(默认情况下,Docker Compose会为所有服务创建默认网络,无需额外配置)。
内容的提问来源于stack exchange,提问作者Nakeuh
相关产品推荐
相关产品推荐

