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为postgresenvironment: - 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
相关产品推荐
相关产品推荐

