Flask应用Docker部署连接PostgreSQL报错:无法解析主机名'db'
解决psycopg2.OperationalError: could not translate host name "db" to address问题
错误原因
你单独使用docker run启动backend容器时,它处于Docker默认的bridge网络中,而你的PostgreSQL服务(db)是通过docker-compose启动在专属自定义网络里的。两个容器不在同一网络,导致backend无法解析db这个主机名。
解决方案
方案1:使用docker-compose启动整个服务(推荐)
直接用docker-compose管理所有服务,这样所有容器会自动加入同一个网络,服务名可直接解析:
- 修正docker-compose.yml中backend的依赖配置(将
depends_on从pgadmin改为db,保证db优先启动):services: backend: # ...其他原有配置 depends_on: - db # 替换原有的pgadmin依赖 # 可移除links配置,自定义网络已支持服务名解析 - 启动所有服务:
docker-compose up --build - 访问应用时使用8000端口(对应docker-compose里的
8000:8000端口映射)。
方案2:手动将单独启动的容器加入docker-compose网络
如果一定要单独运行backend镜像,需要把它加入db所在的网络:
- 查看docker-compose创建的专属网络:
找到对应项目的网络,名称通常为docker network ls{你的项目目录名}_default。 - 先启动db服务:
docker-compose up -d db - 启动backend容器时指定加入该网络:
docker run -p 5000:5000 --network {网络名称} employee-manager
额外优化建议
- 移除db服务中的
hostname: postgres配置,docker-compose的服务名db已可作为主机名被其他容器解析。 - 确保数据库连接字符串中的密码、数据库名与docker-compose里的环境变量完全一致。
内容的提问来源于stack exchange,提问作者NendoRiki
相关产品推荐
相关产品推荐

