运行 多容器中的 Django 迁移 Docker

Running Django migrations in a multi-container Docker setup

允许 Django 应用程序的多个实例同时 运行 同一个数据库迁移是否安全?

场景描述

这是一个 Django 应用程序的多个实例 运行 在负载平衡器后面的设置。当 Docker 容器的更新版本可用时,每个旧 Docker 图像都将替换为新版本。

如果存在新的 Django 迁移,它们需要 运行。这让我想到了一个问题:允许多个容器同时 运行 迁移 (python manage.py migrate) 是否安全?


关于这个问题的答案,我有两个假设。

  1. 是的,它很安全。由于数据库级锁定,迁移不会发生冲突,最后,一个迁移脚本将 运行 而另一个报告没有要应用的迁移。
  2. 不,这不安全。这两个迁移在尝试修改数据库时可能会相互冲突。

不,同时 运行 在所有容器中迁移是不安全的,因为您最终可能会应用相同的迁移两次。

有两种可能的情况:

  1. 两次应用迁移(例如添加 table 列)违反了数据库约束,因此只有 运行 迁移设法完成迁移的第一个容器。在这种情况下,其他容器将死亡,尽管您的编排系统可能会重新启动它们。

  2. 应用迁移两次不违反任何约束,因此可以应用多次。在这种情况下,您可能会得到重复的数据。

无论如何,你应该尽量让一个容器同时应用迁移。