Django连接PostgreSQL报错:nodename nor servname provided求助
Django连接PostgreSQL失败:"nodename nor servname provided"问题解析
问题1:nodename和servname指的是什么?
这个错误里的nodename是主机名,servname是服务名,本质是DNS解析失败——你的Django程序无法将配置里的HOST: "db"解析成可访问的网络地址,找不到对应的PostgreSQL服务。
问题2:为什么连接失败?
核心原因是运行方式和配置不匹配,再加上Docker配置存在几个错误:
- 你直接在本地终端运行
python manage.py runserver,但settings.py里数据库HOST设为"db",这个主机名只有在Docker Compose创建的内部网络中才有效,本地系统(非Docker环境)无法解析这个域名,自然连不上数据库。 - Docker配置的额外问题:
- Dockerfile里的
WORKDIR写的是你本地的绝对路径,容器内不存在这个目录,会导致后续命令执行失败。 - docker-compose.yml中web服务的volumes配置错误,当前写法是把容器内的目录挂载到本地,反过来了。
- PostgreSQL容器只开启了信任登录,但没有显式设置用户名、密码和数据库名,和settings里的配置虽能兼容,但存在潜在匹配问题。
- Dockerfile里的
修复步骤
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
相关产品推荐
相关产品推荐

