问题:
在本地,我使用 Skaffold (Kubernetes) 热重载代码的客户端和服务器端。当我关闭它时,它会删除我的服务器 pod,包括我的 /migrations/ 文件夹,因此与我的数据库 alembic_version 不同步。在生产中,我不会删除我的服务器 pod,但我会在部署时重建 docker 映像,这会导致我的 /migrations/ 文件夹被替换。
问题
如何处理这些迁移,以使我的数据库不会不同步?
应用程序设置
Flask/Python API 并使用 Flask Migrate。对于那些不熟悉的人,它的作用是创建一个带有版本文件的迁移文件夹,例如5a7b1a44a69a_.py
. 该文件的内部是def upgrade()
和downgrade()
操作数据库。它还记录了我的 postgres pod 中 alembic_version 表的修订和 down_revision 引用。
Kubernetes 和 Docker 设置
我有一个服务器 pod 和 postgres pod。我登录到服务器 pod 的 shell 以运行迁移命令。它在 docker 容器内创建版本文件并更新数据库。
要显示问题的分步示例:
- sh 进入服务器部署 pod 并运行 db init。
- 迁移文件夹已创建。
- 在创建迁移文件并更新数据库的服务器部署上执行迁移。
- postgres pod db 输入 alembic_version 并进行更新。
- 使用 skaffold 删除或 ctrl-c skaffold。
- server-deployment pod 被删除,但 postgres 没有。迁移文件夹消失。
- 开始备份 skaffold 和 sh 到 server-deployment pod 并尝试运行 db migrate。要求您执行 db init。
- 如果您尝试从这里降级,它不会做任何事情。现在服务器 pod 和 postgres pod 在 alembic_version 方面不同步。
最后的笔记
我以前做的 pre-docker/kubernetes 是在本地运行它,然后我会将迁移版本文件提交到我的 repo。它在所有环境中同步,因此每个人的 repo 都在同一个 alembic_version 上。我考虑过创建一个单独的、永远在线的“迁移部署”pod,它是烧瓶的另一个实例,因此它永远不会丢失 /migrations/ 文件夹。然而,这似乎是一个非常糟糕的解决方案。
希望有最佳实践或想法!