【问题标题】:How do I perform Laravel Artisan migrations on AWS Elastic Beanstalk?如何在 AWS Elastic Beanstalk 上执行 Laravel Artisan 迁移?
【发布时间】:2014-05-23 08:40:39
【问题描述】:

我有一个 Laravel 安装,并设置了三个具有各自相应配置目录的环境:

  • 本地
  • 分期
  • 生产

我使用php artisan migrate:make create_users_table 等描述here 来创建数据库迁移。

在我的本地环境中,我使用 Vagrant 和一个简单的 MySQL 服务器设置,而在暂存和生产环境中,我使用 AWS RDS。

要为 staging environment 配置数据库访问权限,我有一个 app/config/staging/database.php 文件,其设置如下:

...
"mysql" => array(
    "driver" => "mysql",
    "host" => $_SERVER["RDS_HOSTNAME"],
    "database" => $_SERVER["RDS_DB_NAME"],
    "username" => $_SERVER["RDS_USERNAME"],
    "password" => $_SERVER["RDS_PASSWORD"],
    "charset" => "utf8",
    "collaction" => "utf8_unicode_ci",
    "prefix" => "",
),
...

我使用 git 来部署带有 git aws.push 的应用程序,如 here 所述。

问题是:部署时如何在我的暂存(以及后来的生产)EBS 服务器上运行迁移?

【问题讨论】:

    标签: php amazon-web-services laravel amazon-elastic-beanstalk amazon-rds


    【解决方案1】:

    我通过在我的项目的根目录中创建一个名为.ebextensions 的新目录解决了这个问题。在那个目录中我创建了一个脚本文件my-scripts.config:

    .ebextensions/
        my-scripts.config
    app/
    artisan
    bootstrap
    ...
    

    文件my-scripts.config 在 EBS 部署时执行,是一个 YAML 文件,如下所示:

    container_commands:
        01-migration:
            command: "php /var/app/ondeck/artisan --env=staging migrate"
            leader_only: true
    

    将目录和文件添加到git,提交,运行git aws.push,它就会迁移。

    .ebextensions 中的内容如何工作的解释可以在here 找到。

    路径/var/app/ondeck 是脚本运行时应用程序所在的位置,之后会复制到/var/app/current

    artisan 选项--env=staging 有助于告诉artisan 它应该在什么环境中运行,以便它可以从app/config/staging/database.php 中找到正确的数据库设置

    如果您需要一种快速而肮脏的方式来记录迁移命令失败的原因,您可能需要尝试"php /var/app/ondeck/artisan --env=staging migrate > /tmp/artisan-migrate.log" 之类的内容,以便您可以登录到您的 ec2 实例并检查日志。

    【讨论】:

    • 那么接下来的迁移会发生什么?就像那些我不能再次将它们添加到 GIT 一样,因为它们已经添加了。或者我无法运行 git aws.push 。那么这将是什么步骤呢? - 谢谢。
    • @HimelNagRana 我不太了解,但您可能误解了迁移(应该)如何工作。你所有的迁移脚本都应该在 git repo 中。您的数据库不应该在每次部署时都“重置”,迁移应该只在迁移脚本中的 up 方法中执行小的更改。查看迁移文档:laravel.com/docs/4.2/migrations
    • 我想我没能说清楚。对此感到抱歉。我了解迁移的工作原理(或应该工作)。这是一个与部署相关的问题,我能够弄清楚如何。例如,假设我想将“last_login”添加到用户实体。然后我将生成迁移并运行它。我的问题是,在部署到 ElasticBeanstalk 时,我是否需要做一些特殊的事情才能使迁移运行?后来我发现答案是“不”。还是谢谢。
    • @HimelNagRana 我明白了,就像您发现自己除了上面的 migrate 命令之外不需要任何东西。干杯!
    • @Manuel 这就是它所说的,有点像,在文档中:docs.aws.amazon.com/elasticbeanstalk/latest/dg/…(搜索 leader_only)。自从写了这个 SO Q&A 之后,我已经开始从 CI 环境执行迁移,所以我不再使用这种方法了。
    【解决方案2】:

    oskarth 回答后,过去几年中有关 AWS Elastic Beanstalk 如何部署新应用程序版本的一些说明可能已更改。根据 .ebextensions 的 container_commands 相关的 AWS 文档,如果未设置“cwd”选项,则工作目录是解压缩应用程序的暂存目录。这意味着在部署过程中实例下的用户将被定位到/var/app/staging/,也就是应用程序的提取源版本所在的位置。因此,artisan 命令可以单独执行,也可以通过 var/app/staging/ 路径而不是 /var/app/ondeck/ 执行,如下所示:

    container_commands:
    01-migration:
        command: "php artisan --env=staging migrate"
        leader_only: true
    

    或者这个

    container_commands:
    01-migration:
        command: "php /var/app/staging/artisan --env=staging migrate"
        leader_only: true
    

    我已经使用上述两种配置部署了我的项目。我发现几个小时后查看 eb-engine.log 文件并一遍又一遍地阅读文档。我希望任何人在阅读完之后也能花这么长时间。可以在终端、环境控制台或通过与环境关联的 S3 存储桶 上的 eb logs 命令访问日志。文档中解释了几乎所有内容。我没有在oskarth 上发表评论 我还不允许!

    ps。 /var/app/staging 路径与 laravel 中的暂存环境无关。

    【讨论】:

      【解决方案3】:

      这里值得一提的是,如果人们使用 dockerised 容器在 Beanstalk 上运行他们的应用程序,则必须在容器内运行它。

      files:
          "/opt/elasticbeanstalk/hooks/appdeploy/post/98_build_app.sh":
              mode: "000755"
              owner: root
              group: root
              content: |
                  #!/usr/bin/env bash
                  echo "Running laravel migrations" >> /var/log/eb-activity.log
                  docker exec $(docker ps -qf name=php-fpm) sh -c "php artisan --env=staging migrate --force || echo Migrations didnt run" >> /var/log/eb-activity.log 2>&1
      

      问题是容器名称每次都会改变。

      所以docker ps -qf name=php-fpm 部分将获得一个容器名称包含php-fpm 的容器。因此,将其替换为与您要在其上运行它的容器相匹配的其他内容。

      也使用--force,否则它会尝试等待提示

      【讨论】:

        猜你喜欢
        • 2019-12-29
        • 2019-04-23
        • 2019-04-03
        • 1970-01-01
        • 2020-09-21
        • 2015-11-05
        • 2021-02-03
        • 2014-03-10
        • 2015-06-14
        相关资源
        最近更新 更多