Django/Docker预发布环境模型更新后migrate未检测未生效问题排查求助
问题根源
你在docker-compose-preprod.yml中配置了命名卷app_volume挂载到容器的/usr/src/app目录,该卷中存储的是首次运行容器时生成的旧版本代码。每次容器启动时,卷内的旧代码会覆盖你新构建镜像中已更新的代码,因此无论你怎么重新构建镜像、重启容器,容器内实际运行的还是旧版本代码,自然检测不到模型变更。
验证方法
你可以执行docker exec -it virage_web cat /usr/src/app/[你修改的模型文件路径],对比输出内容和服务器上拉取的最新代码,会发现容器内的文件还是旧版本。
解决方案
临时修复步骤
- 停止所有关联容器,单独删除旧的
app_volume(注意不要删除static_volume和media_volume,避免丢失静态资源和用户上传的媒体文件)
docker-compose -f docker-compose-preprod.yml down docker volume rm [你的项目前缀]_app_volume # 项目前缀默认是docker-compose文件所在的目录名,你可以通过docker volume ls查看具体的卷名
- 重新构建镜像并启动容器
docker-compose -f docker-compose-preprod.yml build docker-compose -f docker-compose-preprod.yml up -d
永久优化方案
- 移除
docker-compose-preprod.yml中所有服务下app_volume的挂载配置,预发布/生产环境不需要通过卷挂载代码,镜像内已经包含了完整的可运行代码,该挂载只会导致代码被旧卷覆盖的问题。 - 不要在预发布/生产环境执行
makemigrations命令:该操作应该在本地开发阶段完成,生成的迁移文件要提交到Git仓库,服务器上的entrypoint.preprod.sh只需要保留migrate命令即可,避免服务器生成的迁移文件和本地不一致引发后续问题。 - 额外检查:确认修改了模型的应用已经添加到Django配置的
INSTALLED_APPS列表中,未加入列表的应用Django不会检测其模型变更。
内容的提问来源于stack exchange,提问作者Mereva
相关产品推荐
相关产品推荐

