在具有多个容器实例的Docker容器中使用Rails运行迁移

我见过很多为Rails应用程序制作Docker容器的例子。 通常他们运行一个rails服务器,并且有一个运行迁移/设置的CMD,然后调出Rails服务器。

如果我同时生成这些容器中的5个,那么Rails如何处理试图启动迁移的多个进程? 我可以看到Rails在一般查询日志(这是一个MySQL数据库)中检查当前模式版本:

SELECT `schema_migrations`.`version` FROM `schema_migrations` 

但是如果在不同的Rails实例中同时发生这种情况,我可以在这里看到一个竞争条件。

考虑到DDL在MySQL中不是事务性的,而且在运行迁移时(除了迁移事务之外),在通用查询日志中没有看到发生任何locking,所以似乎将它们并行启动将是一个坏主意。 事实上,如果我在本地启动了三次,我可以看到两个rails实例在创build表时崩溃,因为它已经存在,而第三个rails实例愉快地完成迁移。 如果这是一个将某些东西插入到数据库中的迁移,那将是非常不安全的。

那么运行一个运行迁移/设置的容器然后生成一个独angular兽实例(这反过来又会产生多个轨道工作者)是更好的主意吗?

我应该产卵N铁轨容器和一个运行迁移的“迁移容器”然后退出?

有更好的select吗?

特别是Rails我没有任何经验,但是从docker和软件工程的angular度来看。

Docker团队有时非常积极地主张集装箱是关于运输应用的。 杰罗姆·皮塔佐尼(Jerome Petazzoni)在这个非常棒的声明中表示,这完全是关于分离的问题。 我觉得这正是你已经想清楚的一点。

运行启动迁移或安装的rails容器可能对初始部署非常有用,而且在开发过程中可能经常需要。 但是,在投入生产时,你应该考虑把问题分开。

因此,我会说有一个图像,你用它来运行N rails容器,并添加一个工具/迁移/设置任何容器,你用来做pipe理任务。 看看官方的Rails镜像的开发人员对此有何看法:

它的目的是作为一个扔掉容器(装载你的源代码,并启动容器启动你的应用程序),以及build立其他图像的基地。

当你看这个图像时,没有设置或迁移命令。 如何使用它完全取决于用户。 所以当你需要运行几个容器时,请继续。

从我的经验与MySQL这工作正常。 你可以运行一个只有数据的容器来托pipe数据,用mysql服务器运行一个容器,最后运行一个容器来执行备份和恢复等pipe理任务。 对于所有三个容器,您可以使用相同的图像。 现在你可以自由地访问你的数据库,让我们说几个WordPress的容器。 这意味着明确分离关注。 当你使用docker-compose时,pipe理所有这些容器并不难。 当然,已经有很多第三方的容器和工具可以支持你build立一个由多个容器组成的复杂应用程序。

最后,您应该决定docker微服务架构是否适合您的问题。 正如本文所概述的,有一些原因反对。 其中一个核心问题是它增加了一个全新的复杂层次。 然而,许多解决scheme就是如此,我想你已经意识到了这一点,并愿意除此之外。

 docker run <container name> rake db:migrate 

启动你的标准应用程序容器,但不要运行CMD( rails server ),但rake db:migrate

更新:由罗马build议,现在的命令是:

 docker exec <container> rake db:migrate 
Interesting Posts