Docker容器间通信异常:Django应用无法连接Postgres数据库
Django+Postgres Docker Compose 主机名解析错误解决方案
以下是针对django.db.utils.OperationalError: could not translate host name "postgres" to address: Name or service not known错误的排查和解决步骤:
确认服务名称与Django配置匹配
确保docker-compose.yml中Postgres服务的名称为postgres,且Django的数据库主机配置完全对应这个名称。示例docker-compose.yml片段:services: postgres: image: postgres:15 environment: POSTGRES_USER: your_user POSTGRES_PASSWORD: your_pass POSTGRES_DB: your_db web: build: . command: gunicorn your_project.wsgi:application --bind 0.0.0.0:8000 environment: DB_HOST: postgres DB_USER: your_user DB_PASSWORD: your_pass DB_NAME: your_db解决服务启动顺序问题
depends_on仅保证Postgres先启动,但不确保其就绪。给Postgres添加健康检查,让Django在数据库完全就绪后启动:postgres: image: postgres:15 environment: # 保留原有环境变量 healthcheck: test: ["CMD-SHELL", "pg_isready -U your_user -d your_db"] interval: 5s timeout: 5s retries: 5 web: # 保留原有配置 depends_on: postgres: condition: service_healthy验证Django数据库配置
检查app/settings/dev.py中的数据库配置,确保HOST字段使用服务名:import os DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': os.environ.get('DB_NAME'), 'USER': os.environ.get('DB_USER'), 'PASSWORD': os.environ.get('DB_PASSWORD'), 'HOST': os.environ.get('DB_HOST'), # 值应为"postgres" 'PORT': '5432', } }禁用手动固定IP配置
Docker Compose默认会为项目创建专属桥接网络,支持服务名解析。删除任何手动指定的固定IP配置,让服务自动加入默认网络。检查容器网络归属
运行docker compose ps确认两个服务容器均处于运行状态,再通过以下命令验证它们在同一网络:docker inspect <web_container_id> | grep Networks docker inspect <postgres_container_id> | grep Networks测试容器内DNS解析
进入web容器执行DNS查询,验证能否解析postgres:docker compose exec web nslookup postgres如果解析失败,尝试重启Docker服务,或检查Docker的DNS配置是否正常。
内容的提问来源于stack exchange,提问作者franco giova
相关产品推荐
相关产品推荐

