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

Django连接PostgreSQL报错:nodename nor servname provided求助

Django连接PostgreSQL失败:"nodename nor servname provided"问题解析

问题1:nodename和servname指的是什么?

这个错误里的nodename是主机名,servname是服务名,本质是DNS解析失败——你的Django程序无法将配置里的HOST: "db"解析成可访问的网络地址,找不到对应的PostgreSQL服务。

问题2:为什么连接失败?

核心原因是运行方式和配置不匹配,再加上Docker配置存在几个错误:

  1. 你直接在本地终端运行python manage.py runserver,但settings.py里数据库HOST设为"db",这个主机名只有在Docker Compose创建的内部网络中才有效,本地系统(非Docker环境)无法解析这个域名,自然连不上数据库。
  2. Docker配置的额外问题:
    • Dockerfile里的WORKDIR写的是你本地的绝对路径,容器内不存在这个目录,会导致后续命令执行失败。
    • docker-compose.yml中web服务的volumes配置错误,当前写法是把容器内的目录挂载到本地,反过来了。
    • PostgreSQL容器只开启了信任登录,但没有显式设置用户名、密码和数据库名,和settings里的配置虽能兼容,但存在潜在匹配问题。

修复步骤

1. 用Docker Compose启动服务(不要本地直接运行)

在项目根目录执行以下命令,让web容器和db容器处于同一Docker网络中,这样"db"主机名就能被正常解析:

docker-compose up --build

2. 修正Docker配置文件

修改Dockerfile:

# Pull base image
FROM python
# Set environment variables
ENV PIP_DISABLE_PIP_VERSION_CHECK 1
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# 改为容器内的工作目录,避免依赖本地路径
WORKDIR /app
# Install dependencies
COPY ./requirements.txt /app/
RUN pip install -r requirements.txt
# Copy project
COPY . /app/

修改docker-compose.yml:

version: "3"

services:
  web:
    build: "."
    command: python manage.py runserver 0.0.0.0:8000
    # 本地目录映射到容器内的工作目录
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    depends_on:
      - "db"

  db:
    image: postgres:latest
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    # 显式设置和settings匹配的数据库参数
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=postgres
      - POSTGRES_HOST_AUTH_METHOD=trust

volumes:
  postgres_data:

3. 保持settings.py配置不变

你的DATABASES配置是正确的,只要通过Docker Compose启动服务,就能正常连接到PostgreSQL容器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:24:51