Docker-Compose+Django+PostgreSQL迁移数据不入库问题求助
问题排查与解决方案:Docker+Django+PostgreSQL 迁移后数据库无数据
可能的问题点及解决步骤
1. 数据库服务未完全就绪就执行迁移
depends_on仅保证容器启动顺序,无法确保PostgreSQL服务完全就绪。web容器可能在数据库还没准备好时就执行迁移,导致迁移静默失败。
解决方法:
在web服务的启动命令中添加等待数据库就绪的逻辑,修改docker-compose.yml的web.command:
command: > sh -c "until pg_isready -h ${POSTGRES_HOST} -p ${POSTGRES_PORT}; do sleep 2; done; python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
同时需要在Dockerfile中安装PostgreSQL客户端工具,否则pg_isready命令不存在:
FROM python:3.8 ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 WORKDIR /code # 安装postgresql客户端工具 RUN apt-get update && apt-get install -y postgresql-client && rm -rf /var/lib/apt/lists/* COPY requirements.txt . RUN pip install -r requirements.txt COPY . .
2. 环境变量配置冗余或错误
PostgreSQL官方镜像仅识别POSTGRES_DB、POSTGRES_USER、POSTGRES_PASSWORD三个环境变量,db服务中的其他变量可以删除,避免混淆。修改docker-compose.yml的db.environment:
environment: - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
同时检查你的.env文件:
POSTGRES_ENGINE必须为django.db.backends.postgresql或django.db.backends.postgresql_psycopg2(根据Django版本选择)POSTGRES_HOST必须为db(Docker Compose中服务名即容器主机名)POSTGRES_PORT保持默认的5432
3. 迁移命令未实际执行或执行失败
查看web容器的日志,确认迁移是否成功:
docker-compose logs web
如果日志显示"No migrations to apply"但你有模型变更,可手动进入web容器重新执行迁移:
docker-compose exec web python manage.py makemigrations docker-compose exec web python manage.py migrate
观察输出是否有错误提示。
4. 数据库连接或挂载异常
进入db容器,直接检查数据库状态:
docker-compose exec db psql -U ${POSTGRES_USER} -d ${POSTGRES_DB} # 执行SQL查看表是否存在 \dt
如果没有任何表,说明迁移未执行成功;如果有表但无数据,问题出在数据写入逻辑(如未调用save()、事务未提交等)。
5. Django代码层面的事务问题
检查你的业务代码:
- 确认模型实例创建后调用了
instance.save() - 如果使用
transaction.atomic(),排查是否有异常导致事务回滚 - 查看Django日志是否存在事务回滚的相关信息
验证流程
- 停止并重置容器与数据卷:
docker-compose down -v - 重新构建并启动服务:
docker-compose up --build - 查看web容器日志,确认迁移命令成功执行
- 进入db容器,用psql验证表是否生成
- 通过Django admin或测试视图写入数据,再次验证数据库中是否存在数据
内容的提问来源于stack exchange,提问作者Ivan Campelo
相关产品推荐
相关产品推荐

