【问题标题】:Which is the right way to run laravel migrations using Google Cloud Run and Google Cloud SQL这是使用 Google Cloud Run 和 Google Cloud SQL 运行 laravel 迁移的正确方法
【发布时间】:2021-09-01 16:04:31
【问题描述】:

我来这里是为了公开我发现使用 Google Cloud SQL 和 Laravel 运行迁移到 Google Cloud Run 项目的具体方法,这很简单,我只需从我的 .env laravel 连接到 Cloud SQL(使用 Cloud SQL代理)并从我的本地控制台使用经典命令 php artisan migrate 运行迁移。

我从来没有找到另一种方式来运行迁移,因为我目前正在制作它们,实际上我从来没有找到关于它的更多信息,所以这就是问题所在:

除了在本地环境中运行 laravel 迁移到 Google Cloud Run 之外,还有其他简单且安全的方法吗?

【问题讨论】:

  • 最好的方法是在应用代码之外执行迁移,例如在 CI/CD 管道中。
  • 我建议您在部署 Cloud Run 之前执行数据库设置(迁移)。查看其他项目,例如会话和 cookie,并启用将它们存储在数据库中而不是容器中的本地文件中。有一些工具可用于监视文件系统活动。在大多数情况下,您希望 Laravel 或您的应用程序在本地创建的任何文件都存储在数据库或云存储中。 Cloud Run 没有存储持久性。

标签: laravel google-cloud-sql google-cloud-run laravel-migrations cloud-sql-proxy


【解决方案1】:

如果使用 HTTP Post 请求调用,您可以添加控制器函数来执行 Artisan 命令。

例如,将此控制器函数用于您应用上的/migrate 路径(在您的路由文件中使用Route::post 注册)。

public function migrate(Request $request)
{
    Artisan::call('migrate');
}

您可以通过向 /migrate 发送 HTTP 请求来执行 Artisan migrate 命令

curl -request POST \
     --header "Content-Type: application/json" \
     https://you-cloud-run-app-url.run.app/migrate

但此解决方案的缺点是安全性。您必须制作自己的中间件来保护此操作免受不允许的请求(或使用OAuth2 protocol)。

参考:

【讨论】:

  • 谢谢,我在运行时收到“未定义常量 'STDIN'”错误,你知道为什么吗?
【解决方案2】:

您可以使用 app-engine-exec-wrapper,它是 Cloud SQL Auth 代理的助手。它将帮助您安全地连接数据库。这是一个如何将它用于 Django 应用程序的示例:

  - id: "apply migrations"
    name: "gcr.io/google-appengine/exec-wrapper"
    args:
      [
        "-i",
        "gcr.io/$PROJECT_ID/${_SERVICE_NAME}",
        "-s",
        "${PROJECT_ID}:${_REGION}:${_INSTANCE_NAME}",
        "-e",
        "SETTINGS_NAME=${_SECRET_SETTINGS_NAME}",
        "--",
        "python",
        "manage.py",
        "migrate",
      ]

您可以访问their github page了解更多信息。

【讨论】:

    【解决方案3】:

    短版(非常短版):

    1. 创建一个新文件并将其命名为任何名称(例如“db-migration.sh”)并添加以下内容:
    #!/bin/bash
    
    # Run Laravel migration (by force, since it would be a prod-environment)
    php artisan migrate --force
    
    # Run Apache in "foreground" mode (the default mode that runs in Docker)
    apache2-foreground
    
    1. 在 Dockerfile 中添加以下 2 行
    # Make the file executable, or use "chmod 777" instead of "chmod +x"
    RUN chmod +x /var/www/html/db-migration.sh
    
    # This will run the shell file at the time when container is up-and-running successfully (and NOT at the BUILD time)
    ENTRYPOINT ["/var/www/html/db-migration.sh"]
    
    

    假设:

    • Docker 映像具有 PHP/Apache 组合(而不是 Alpine/Nginx 版本)
    • Cloud Run 配置正确
    • Cloud SQL 已正常运行并与 Cloud Run 正确连接

    检查 Cloud Run 服务的“日志”选项卡以验证迁移是否成功执行(附上测试迁移的屏幕截图)

    【讨论】:

      猜你喜欢
      • 2020-10-25
      • 2020-02-10
      • 2019-02-20
      • 2017-11-24
      • 2020-11-05
      • 2019-10-27
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多