Docker Compose中Python脚本连接PostgreSQL遇主机名解析错误
解决psycopg2无法解析postgres主机名的问题
核心原因
你用docker run启动的advocacy-app容器默认加入Docker的默认桥接网络,而docker-compose配置中的postgres容器在自定义的mynetwork网络里,两个网络相互隔离,导致容器无法通过主机名postgres找到数据库服务。
解决方案
方法1:用docker-compose run替代docker run
直接通过docker-compose运行脚本容器,它会自动加入配置中定义的mynetwork,无需手动指定网络:
docker-compose run advocacy-app python3 app/pipeline.py
方法2:手动指定docker-compose的网络运行容器
- 先查看docker-compose创建的自定义网络名称:
docker network ls
通常名称格式为{当前目录名}_mynetwork,比如当前目录是advocacy-service,网络名就是advocacy-service_mynetwork。
- 运行容器时指定加入该网络:
docker run --network=<你的mynetwork名称> advocacy-app python3 app/pipeline.py
额外注意事项
数据库名称不匹配:你的
config.yaml中指定的数据库是falcon,但docker-compose的postgres配置里POSTGRES_DB是postgres。需要二选一修改:- 要么修改
config.yaml的database字段为postgres; - 要么修改docker-compose中postgres的
POSTGRES_DB环境变量为falcon,让容器初始化时创建对应数据库。
- 要么修改
数据库服务就绪延迟:
depends_on仅保证postgres容器启动,但不保证数据库服务完全就绪。可以在你的Python脚本中添加数据库连接重试逻辑,避免因服务未就绪导致的连接失败。
内容的提问来源于stack exchange,提问作者Abdullah Zia
相关产品推荐
相关产品推荐

