来自 Cloud Build 的 运行 php artisan 命令

Run php artisan commands from Cloud Build

我正在使用 Cloud Build 在云上部署我的应用程序 运行。我想在 cloudbuild.yaml 中将 php artisan 命令设置为 运行 迁移,初始化护照库...但是我在 Laravel 初始化步骤中遇到了这个错误:

Starting Step #3 - "Laravel Init"
Step #3 - "Laravel Init": Already have image (with digest): gcr.io/cloud-builders/gcloud
Step #3 - "Laravel Init": bash: php: command not found
Step #3 - "Laravel Init": bash: line 1: php: command not found
Step #3 - "Laravel Init": bash: line 2: php: command not found
Step #3 - "Laravel Init": bash: line 3: php: command not found
Step #3 - "Laravel Init": bash: line 4: php: command not found
Finished Step #3 - "Laravel Init"
ERROR
ERROR: build step 3 "gcr.io/cloud-builders/gcloud" failed: step exited with non-zero status: 127

这是我的 cloudbuild.yaml

steps:
  # Build the container image
  - name: 'gcr.io/cloud-builders/docker'
    args:
    ...
    id: Build

  # Push the container image to Artifacts Registry
  - name: 'gcr.io/cloud-builders/docker'
    ...
    id: Push

  # Deploy container image to Cloud Run
  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
    id: Deploy
    entrypoint: gcloud
    ...

 # Laravel Init
  - name: 'gcr.io/cloud-builders/gcloud'
    id: Laravel Init
    entrypoint: "bash"
    args:
      - "-c"
      - |
          php artisan migrate --force
          php artisan db:seed --force
          php artisan db:seed --class=Database\Seeders\UsersTableSeeder --force
          php artisan passport:install

images:
  - 'europe-west3-docker.pkg.dev/$PROJECT_ID/.....'
tags:
  - latest

如何执行我的 php artisan 命令?

根据此输出 php: command not found,您的云环境中似乎没有安装 PHP

我找到了解决办法。我使用了助手 exec-wrapper。有了这个助手,我可以使用我的 laravel 容器环境并使用嵌入式云 sql 代理连接到云 SQL。所以我只需要传递我之前在 cloudbuild.yaml 的第一步中构建的最新当前图像。我设置了数据库套接字连接,然后传递 migration.sh 文件,我可以在其中 运行 所有 php artisan 命令。

我正在使用 mysql,因此如果您使用的是另一个数据库,则必须调整端口和连接名称。

cloudbuild.yaml:

steps:
  # Build the container image
  - name: 'gcr.io/cloud-builders/docker'
    args:
    ...
    id: Build

  # Push the container image to Artifacts Registry
  - name: 'gcr.io/cloud-builders/docker'
    ...
    id: Push

  # Deploy container image to Cloud Run
  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
    id: Deploy
    entrypoint: gcloud
    ...

 # Laravel Init
  - name: 'gcr.io/google-appengine/exec-wrapper'
    id: Laravel Init
    args: [
      '-i', '<YOUR_IMAGE_URL>',
      '-e', 'DB_CONNECTION=mysql',
      '-e', 'DB_SOCKET=/cloudsql/<YOUR_CLOUD_SQL_INSTANCE>',
      '-e', 'DB_PORT=3306',
      '-e', 'DB_DATABASE=<YOUR_DATABASE_NAME>',
      '-e', 'DB_USERNAME=<YOUR_DB_USER>',
      '-e', 'DB_PASSWORD=<YOUR_DB_PASS>',
      '-s', '<YOUR_CLOUD_SQL_INSTANCE>',
      '--', '/app/scripts/migration.sh'
    ]
images:
  - 'europe-west3-docker.pkg.dev/$PROJECT_ID/.....'

关注 /app/scripts/migration.sh 中的 /app 文件夹。 /app 是我在 Dockerfile

中设置的 WORKDIR

migration.sh 看起来像这样:

#!/bin/bash

php artisan migrate --force
php artisan db:seed --force
#... add more commands

不要忘记在 IAM 部分中将权限 Client Cloud SQL 添加到 Cloud Build 服务,否则 Cloud Build 无法连接到您的 Cloud SQL 实例。

并关心您的图像是否有入口点文件。您必须使用 exec $@ 从 App Engine exec 包装器执行 -- 命令。如果你不使用它,命令将被忽略。