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

