docker容器的Django迁移

docker容器的Django迁移,django,postgresql,docker,django-models,docker-compose,Django,Postgresql,Docker,Django Models,Docker Compose,我一直在试图解决一个问题,我现在有,但我没有找到任何适当的解决方案,无论是在这里或其他地方,所以我希望这里的人可能有一个答案。我已经到了一个地步,我知道问题是什么,但不知道如何解决它 基本上,我有一个运行django/postgres/nginx的网站,它运行平稳,我可以创建新模型并迁移它们,但如果我尝试向模型添加一个字段: from django.db import models class project(models.Model): project_name = models.C

我一直在试图解决一个问题,我现在有,但我没有找到任何适当的解决方案,无论是在这里或其他地方,所以我希望这里的人可能有一个答案。我已经到了一个地步,我知道问题是什么,但不知道如何解决它

基本上,我有一个运行django/postgres/nginx的网站,它运行平稳,我可以创建新模型并迁移它们,但如果我尝试向模型添加一个字段:

from django.db import models

class project(models.Model):
    project_name = models.CharField(max_length=50)
    author = models.CharField(max_length=30, blank=True, null=True)
    date_created = models.DateField()
    #Added in second round of migrations 
    #Description = models.CharField(max_length=150,blank=True, null=True)
我通常会做的是首先构建和旋转我的容器

sudo docker-compose -f docker-compose.yml up --build
在我的入口点文件中,我运行makemigrations和migrate

第一轮很好,但是如果我将Description字段添加到我的模型中,降速并重建容器以允许新字段包含在我的容器中,那么新容器将在不进行初始迁移的情况下构建,而isntead将进行新迁移。这会导致任何以前的postgres表没有添加新字段,并且当我尝试请求数据时出现服务器错误500,因为以前的表现在没有预期的列

因此,我的问题是,您通常如何管理容器化django应用程序的模型,以确保维护所有迁移?还是有其他我不知道的解决方案

这可能是一个愚蠢的问题,但我对这一点还很陌生,如果您能提供任何帮助,我将不胜感激

  • migrate
    操作是危险的,您不应该自动执行
  • entrypoint文件的建议默认行为是运行应用程序服务器
  • 若要迁移数据库,请尝试在容器中运行命令

  • makemigrations
    应该在开发阶段完成,并将迁移文件(000x前缀文件)添加到源代码管理中

    然后,在多次修改之后,您应该有如下内容:

    0001_first_round_change.py
    0002_second_round_change_for_description.py
    ......
    
    每次docker容器启动、迁移这些文件时,都可以在中看到此操作的有用过程


    这是一个开源项目示例,他们使用相同的方法进行迁移,仅供参考。

    感谢您的建议,我将从entrypoint文件中删除迁移,并记住建议的行为。不过,我以前尝试过使用
    exec
    命令运行,但这仍然无法解决在每次重建模型时擦除迁移的问题。目前,我在降速后修改模型,当我降速并构建任何
    makemigration
    调用时,我所做的调用都不会保存到本地machine@AlexS您应该在本地计算机上运行
    makemigration
    ,并将迁移文件添加到git。看啊哈,好吧,这对我来说很有意义。所以,为了完全确定,目前我正在本地运行我的postgres,作为docker compose文件中的一项服务。在不同的情况下,我想我会在容器外运行开发,但仍然可以访问由amazon托管的RDS。所以我还可以在dev中使用数据库?我不确定我是否抓到你了。我的理解是:开发阶段可以独立于ops阶段。只要注意每一次数据库结构的更改都是
    makemigrations
    。然后在生产环境中,只需对所有迁移文件执行
    migrate
    ,如果数据库发生更改,命令将直接跳过它,如。所以在本地开发可以使用本地容器,也可以不在本地使用容器,这取决于您的开发习惯。先给自己做个实验也许更好。。。