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

Docker-Compose部署PostgreSQL与Ubuntu容器:数据库重启及Django连接问题

解决Docker-Compose下PostgreSQL配置与Django测试连接问题

一、正确配置Docker-Compose让Ubuntu 22容器访问PostgreSQL

以下是可直接复用的docker-compose.yml配置,确保两个容器处于同一网络,且PostgreSQL完成初始化后再启动测试服务:

version: '3.8'

services:
  db:
    image: postgres:14-alpine
    environment:
      POSTGRES_USER: django_user
      POSTGRES_PASSWORD: django_pass
      POSTGRES_DB: django_db
    volumes:
      - postgres_data:/var/lib/postgresql/data/  # 持久化数据,避免重启丢失
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U django_user -d django_db"]
      interval: 5s
      timeout: 5s
      retries: 5
    networks:
      - app_network

  app_test:
    build: .  # 替换为你的Ubuntu 22/Django镜像构建路径
    environment:
      DB_HOST: db
      DB_PORT: 5432
      DB_USER: django_user
      DB_PASSWORD: django_pass
      DB_NAME: django_db
    command: ["python", "manage.py", "test"]
    depends_on:
      db:
        condition: service_healthy  # 等待PostgreSQL完全就绪再启动测试
    networks:
      - app_network

volumes:
  postgres_data:

networks:
  app_network:
    driver: bridge

核心配置说明:

  • 两个服务加入同一自定义网络app_network,Ubuntu 22容器可直接通过服务名db访问PostgreSQL
  • 给db服务添加健康检查,确保PostgreSQL完成初始化后才启动测试服务
  • 用volumes持久化PostgreSQL数据,避免容器重启后重新初始化

二、排查PostgreSQL频繁重启与Django测试报错问题

你遇到的relation "django_site" does not exist错误,本质是Django在PostgreSQL未完全就绪时尝试初始化数据库,导致Schema创建失败。结合PostgreSQL重启现象,按以下步骤排查:

1. 查看PostgreSQL容器日志,定位重启原因

执行命令获取详细日志:

docker-compose logs db

常见重启诱因:

  • 权限问题:自定义挂载目录的权限与PostgreSQL运行用户(alpine镜像中UID为70)不匹配,可执行sudo chown 70:70 ./postgres_data修正,或删除旧卷重新创建:docker-compose down -v
  • 内存不足:PostgreSQL启动需要足够内存,可给db服务添加内存限制:deploy: resources: limits: memory: 512M,或清理宿主机内存
  • 环境变量错误:POSTGRES_PASSWORD为空或不符合复杂度要求,POSTGRES_DB包含特殊字符等
  • 数据目录损坏:旧卷中存在损坏的PostgreSQL数据,导致容器启动失败循环重启,解决办法是删除旧卷重新初始化

2. 确保Django测试服务等待PostgreSQL就绪

仅靠depends_on: db只能等待容器启动,无法确保PostgreSQL服务就绪。必须配合service_healthy条件(如上配置),或在测试命令前加入等待脚本:

command: ["./wait-for-it.sh", "db:5432", "--", "python", "manage.py", "test"]

(将wait-for-it.sh复制到Ubuntu 22镜像中即可)

3. 验证PostgreSQL容器稳定性

先单独启动db服务,观察是否会自动重启:

docker-compose up -d db
docker-compose ps db

若db服务稳定运行,再启动app_test,可排除测试服务导致的数据库崩溃(如连接数过载、错误SQL语句)

4. 检查Django测试数据库配置

确保Django测试数据库配置正确:

  • 测试数据库的HOST设置为db
  • POSTGRES_USER拥有创建测试数据库的权限(默认超级用户权限足够)
  • 避免测试前手动删除数据库导致初始化失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:30:55