laravel 从云构建运行php artisan命令

ijnw1ujt  于 2023-03-04  发布在  PHP
关注(0)|答案(2)|浏览(190)

我正在使用Cloud Build在Cloud Run上部署我的应用。我想在我的cloudbuild.yaml中设置php artisan命令以运行迁移、初始化passport库...但我在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

这是我的云构建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工匠命令?

jm81lzqq

jm81lzqq1#

我找到了一个解决方案。我使用了helper exec-wrapper。有了这个helper,我可以使用我的laravel容器env,并通过嵌入式云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 look like this:

#!/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 wrapper的--命令,如果你不使用它,这些命令将被忽略。

    • 编辑**

现在使用Laravel 9,我们可以在迁移过程中使用--isolated参数php artisan migrate--isolated轻松锁定数据库。
因此,我们可以删除gcr.io/google-appengine/exec-wrapper步骤,并将php artisan migrate --isolated命令添加到laravel映像(Dockerfile)中。

gcmastyq

gcmastyq2#

根据这个输出php: command not found,看起来您的云环境中没有安装PHP

相关问题