You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:27:25