You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel部署GCR遇ApplicationDefaultCredentials构造失败求助

问题分析

你遇到的Could not construct ApplicationDefaultCredentials错误,核心原因是Docker构建阶段的容器上下文没有Google认证凭证:
当Docker构建镜像时,Laravel会加载database.php、app.php等配置文件,此时调用的get_secret函数会尝试访问Google Secret Manager,但容器内部并没有继承Github CI主机环境的Google认证信息,导致凭证缺失报错。

解决方案

方案一:延迟配置解析到运行时(推荐)

Laravel支持在配置文件中使用闭包延迟执行敏感配置的获取,避免构建阶段触发Secret Manager调用:

  1. 修改配置文件中的调用方式,将直接调用改为闭包:
// database.php示例
'password' => function () {
    return get_secret('DB_PASSWORD');
},
  1. 若你的Dockerfile中执行了php artisan config:cache,请将该命令移至容器启动脚本(如entrypoint.sh),确保配置缓存在运行时生成,而非构建阶段。

方案二:构建阶段传递临时凭证

如果必须在构建时获取密钥,可将Github CI的Google临时凭证传递到Docker构建环境:

  1. 在Github Workflow中添加步骤生成临时访问令牌:
- name: Generate GCP Access Token
  run: gcloud auth print-access-token > /tmp/gcp_token
  1. 修改docker/build-push-action步骤,传递凭证作为构建秘密:
- name: Build and push EPMS Worker
  uses: docker/build-push-action@v4
  with:
    context: .
    file: worker.Dockerfile
    push: true
    tags: gcr.io/fabled-mystery-328210/fbasegithub/epms-worker:latest
    secrets: |
      "GCP_ACCESS_TOKEN=/tmp/gcp_token"
  1. 在Dockerfile中使用该凭证设置环境变量,完成配置缓存:
RUN --mount=type=secret,id=GCP_ACCESS_TOKEN \
    export GOOGLE_ACCESS_TOKEN=$(cat /run/secrets/GCP_ACCESS_TOKEN) && \
    php artisan config:cache

方案三:避免构建阶段加载敏感配置

使用占位符替代构建阶段的敏感配置,运行时再从Secret Manager获取:

  1. 构建阶段在.env文件中设置占位符:
DB_PASSWORD=BUILD_PLACEHOLDER
  1. 编写容器启动脚本,在运行时调用get_secret替换占位符,或直接在代码逻辑中优先读取Secret Manager的值。
额外注意事项

确保你使用的Github CI服务账户已拥有Google Secret Manager的访问权限(需绑定roles/secretmanager.secretAccessor角色)。

内容的提问来源于stack exchange,提问作者Precious Aang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 17:15:00