Docker部署Django+PostgreSQL时数据库连接失败求助
Django + PostgreSQL容器化部署连接问题解决指南
问题诊断
- 数据库端口配置错误:容器间通信应使用PostgreSQL容器内部端口(5432),而非宿主机映射端口(5433)
- 网络名称自动添加前缀:Docker Compose默认会给网络添加项目目录名作为前缀,导致自定义网络名称未生效
具体修复步骤
1. 修正Django数据库配置(settings.py)
将数据库PORT从5433改为容器内部端口5432:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'InventoryManagement', 'USER': 'postgres', 'PASSWORD': 'root', 'HOST': 'db', 'PORT': '5432' # 修正为容器内部端口 } }
2. 修正Docker Compose网络配置
在networks定义中添加name字段,强制使用指定的网络名称:
version: '3' services: web: build: . ports: - "8000:8000" depends_on: - db networks: - inventory_network db: ports: - "5433:5432" image: postgres:16 environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=root - POSTGRES_DB=InventoryManagement networks: - inventory_network networks: inventory_network: driver: bridge name: inventory_network # 指定网络名称,避免自动添加前缀
3. (可选但推荐)添加数据库就绪等待机制
depends_on仅保证服务启动顺序,不确保PostgreSQL完成初始化。可通过以下方式添加等待逻辑:
修改docker-compose.yml添加等待命令
services: web: build: . ports: - "8000:8000" depends_on: - db networks: - inventory_network command: > sh -c "until pg_isready -h db -p 5432 -U postgres; do echo waiting for postgres; sleep 2; done; python manage.py runserver 0.0.0.0:8000"
对应修改Dockerfile安装postgresql-client
FROM python:3.9 ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 WORKDIR /app # 安装postgresql-client用于执行pg_isready命令 RUN apt-get update && apt-get install -y postgresql-client && rm -rf /var/lib/apt/lists/* COPY requirements.txt /app/ RUN pip install --no-cache-dir -r requirements.txt COPY . /app/ EXPOSE 8000 CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
验证修复
- 清理现有容器和网络:
sudo docker compose down -v
- 重新构建并启动服务:
sudo docker compose up --build
内容的提问来源于stack exchange,提问作者Prisha Goel
相关产品推荐
相关产品推荐

