我们目前遇到一个非常奇怪的问题。我们的技术堆栈涉及 AWS Elastic Beanstalk、EC2 和 Laravel,并使用 Bitbucket Pipelines 部署代码。
问题是,每当我们在部署中包含迁移时,它都会运行两次(与此环境中的 EC2 实例的次数一样多!)。
我们的脚本位于 .ebextensions
目录下:
option_settings:
"aws:elasticbeanstalk:container:php:phpini":
document_root: /public
container_commands:
01initdb:
command: "php artisan migrate"
我们最终破坏了部署几次,因为系统无法判断此迁移已经运行。
以前有人见过这个问题吗?
更新
我们想出了这个实现,因为如果我们添加 MySQL 连接会被拒绝
构建脚本中的 php artisan migrate
。
最佳答案
有很多方法可以做到这一点:
- 让单个 ops 服务器运行仅需要在一台服务器上运行的所有任务。您的 bitbucket 管道可以触发此 ops 服务器来执行单服务器任务,并触发其他服务器执行多服务器任务。
- 创建一个自定义 Artisan 命令,该命令获取锁(数据库或缓存)以运行迁移,同时避免并行运行/竞争条件。
- 连续触发部署(不知道这在 Beanstalk 上是否可行)。
- 正如OP提到的,在Elastic Beanstalk脚本上设置
leader_only: true
标志以仅在单个实例上运行命令就可以了!
关于laravel - EC2 : Laravel migrations run as many times as the instances,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53283329/