laravel - EC2 : Laravel migrations run as many times as the instances

标签 laravel amazon-web-services amazon-ec2

我们目前遇到一个非常奇怪的问题。我们的技术堆栈涉及 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

最佳答案

有很多方法可以做到这一点:

  1. 让单个 ops 服务器运行仅需要在一台服务器上运行的所有任务。您的 bitbucket 管道可以触发此 ops 服务器来执行单服务器任务,并触发其他服务器执行多服务器任务。
  2. 创建一个自定义 Artisan 命令,该命令获取锁(数据库或缓存)以运行迁移,同时避免并行运行/竞争条件。
  3. 连续触发部署(不知道这在 Beanstalk 上是否可行)。
  4. 正如OP提到的,在Elastic Beanstalk脚本上设置leader_only: true标志以仅在单个实例上运行命令就可以了!

关于laravel - EC2 : Laravel migrations run as many times as the instances,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53283329/

相关文章:

php - Laravel 的route()函数中的 "routeName"是什么?

django - 使用 Django 通过 AWS 发送电子邮件,并通过反向 DNS 设置指向不同的服务器

amazon-web-services - 使用以 aws : in IAM policies 为前缀的标签

safari - Amazon S3 图像的临时 URL 在 IE 和 Firefox 中有效,但在 Safari 中无效

mongodb - EC2 安全组中的禁止规则不会影响已建立的 MongoDB 连接

apache - 使用 EC2/Route53 设置子域 VHost

Laravel 地平线 : items no longer queued for no obvious reason

php - 无法使用 000webhost 在 Laravel 中迁移

php - 使用 PHP shell_exec() 导出数据库并压缩它

amazon-web-services - AWS 聊天机器人未发布到 Slack