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

Django容器化时数据库主机名'db'解析失败问题求助

解决Django容器化中PostgreSQL主机名解析失败的问题

核心原因

你的web容器和db容器不在同一个Docker网络中,Docker容器仅能在同一网络内通过服务名(如db)完成DNS解析,这是触发could not translate host name "db" to address报错的直接原因。

修复步骤

1. 将db服务加入与web共享的网络

修改docker-compose.yaml中的db服务配置,添加networks字段并指定elastic网络(与web容器同属该网络):

services:
  db:
    image: postgres:13
    container_name: db
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_NAME=postgresa
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports:
      - "5432:5432"
    networks:
      - elastic  # 加入web容器所在的网络
  # 其他服务配置保持不变

2. 统一数据库名称配置

注意到db服务的环境变量POSTGRES_NAME设置为postgresa,但Django settings.py中数据库NAME配置为postgres,两者不一致会导致连接失败,需统一配置:

  • 方案一:修改db的POSTGRES_NAME为postgres
    environment:
      - POSTGRES_NAME=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    
  • 方案二:修改settings.py中的数据库名称为postgresa
    'default': {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": "postgresa",  # 和db服务的POSTGRES_NAME保持一致
        "USER": "postgres",
        "PASSWORD": "postgres",
        "HOST": "db",
        "PORT": 5432,
    }
    

3. 确保数据库服务就绪后再启动Django

depends_on仅保证容器启动顺序,不代表PostgreSQL服务完全就绪。可在web服务的启动命令中添加等待逻辑,避免Django在数据库未就绪时尝试连接:
修改web服务的command字段:

web:
  build: .
  command: >
    sh -c "
      until pg_isready -h db -p 5432 -U postgres; do
        echo 'Waiting for PostgreSQL to start...'
        sleep 2
      done
      python manage.py runserver 0.0.0.0:8000
    "
  # 其他配置保持不变

同时需在web服务的Dockerfile中安装postgresql-client(提供pg_isready命令):

# 基于Python基础镜像的示例配置
RUN apt-get update && apt-get install -y --no-install-recommends postgresql-client \
    && rm -rf /var/lib/apt/lists/*

验证修复

修改完成后,执行以下命令重启容器:

docker-compose down
docker-compose up --build

内容的提问来源于stack exchange,提问作者Mostafa Mohamed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 04:29:58