Docker化项目中Django后端无法连接PostgreSQL的问题排查
解决Docker中Django无法连接PostgreSQL的主机名解析问题
核心问题分析
报错could not translate host name "db" to address的直接原因是Django容器(cr_api)和PostgreSQL容器(db)不在同一个Docker网络中,导致无法通过服务名"db"进行DNS解析。你的compose.yml中给db指定了cr_nginx_network网络,但cr_api服务没有配置该网络,默认会加入Docker Compose自动创建的默认网络,两个网络隔离,自然无法互通。
分步解决方案
1. 给cr_api服务添加网络配置
修改compose.yml中的cr_api服务,加入和db相同的网络:
cr_api: container_name: cr_api build: context: ./server dockerfile: Dockerfile command: python manage.py runserver 0.0.0.0:5000 ports: - "5000:5000" volumes: - ./server:/cr_server depends_on: - db networks: - cr_nginx_network # 新增这一行
2. 新增数据库健康检查(可选但推荐)
depends_on仅保证容器启动顺序,不代表PostgreSQL服务已经就绪。添加健康检查可以确保Django容器在数据库完全可用后再启动:
db: container_name: db image: postgres:13 ports: - '5432:5432' env_file: - ./server/.env volumes: - dbdata:/var/lib/postgresql/data/ networks: - cr_nginx_network healthcheck: # 新增健康检查配置 test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_NAME}"] interval: 5s timeout: 5s retries: 5 # 同时修改cr_api的depends_on cr_api: # ... 其他配置不变 depends_on: db: condition: service_healthy
3. 验证环境变量加载
确保cr_api容器能正确读取.env中的PostgreSQL配置:
- 进入cr_api容器:
docker exec -it cr_api bash - 执行命令检查环境变量:
echo $POSTGRES_NAME、echo $POSTGRES_USER、echo $POSTGRES_PASSWORD - 如果变量为空,检查
.env文件路径是否正确,或在cr_api服务中显式指定env_file(和db一致)。
修改后的完整compose.yml
version: '3.9' services: db: container_name: db image: postgres:13 ports: - '5432:5432' env_file: - ./server/.env volumes: - dbdata:/var/lib/postgresql/data/ networks: - cr_nginx_network healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_NAME}"] interval: 5s timeout: 5s retries: 5 cr_api: container_name: cr_api build: context: ./server dockerfile: Dockerfile command: python manage.py runserver 0.0.0.0:5000 ports: - "5000:5000" volumes: - ./server:/cr_server depends_on: db: condition: service_healthy networks: - cr_nginx_network volumes: dbdata: pgadmin_data: networks: cr_nginx_network: driver: bridge
内容的提问来源于stack exchange,提问作者Mo1
相关产品推荐
相关产品推荐

