Docker Compose环境下Django makemigrations未生成迁移文件但数据库已变更
问题诊断与解决步骤
核心原因
你的Docker Compose配置里,web服务仅挂载了static和media目录到本地,项目代码目录未挂载。这导致执行makemigrations时,生成的迁移文件只保存在容器内部文件系统中,本地宿主机完全看不到。之前的迁移操作能生效是因为容器内确实生成了文件并完成了数据库同步,但本地从未同步到这些文件;同事删除本地空的migrations目录后,重新生成的文件仍只留在容器里,所以本地依然只有__init__.py。
解决步骤
备份容器内已有的迁移文件(可选但建议)
把容器里的migrations文件复制到本地,避免丢失之前的迁移记录:# 替换[你的APP名称]为实际的Django应用名(比如users、blog等) docker-compose cp web:/app/[你的APP名称]/migrations ./[你的APP名称]/修改docker-compose.yml的挂载配置
在web服务的volumes部分,添加项目代码目录的挂载,让容器内的文件与本地同步:services: web: # ... 其他配置保持不变 ... volumes: - ./:/app/ # 新增这一行,将本地项目根目录挂载到容器的/app目录 - ./static/:/app/static/ - ./media/:/app/media/注:
static和media的挂载优先级更高,不会被根目录挂载覆盖,无需担心静态文件的问题。重启容器并重新生成迁移文件
# 停止并删除现有容器 docker-compose down # 重新构建并启动容器 docker-compose up -d --build # 重新生成迁移文件,这次会同步到本地 docker-compose exec web python manage.py makemigrations验证结果
此时查看本地的migrations目录,应该能看到新生成的.py迁移文件,后续执行migrate即可正常同步数据库。
内容的提问来源于stack exchange,提问作者Vit
相关产品推荐
相关产品推荐

