Google Cloud 运行 - 运行 Shell firebase 项目中的脚本

Google Cloud Run - Run Shell Script in firebase project

我是 google cloud-运行 的新手,我希望在 firebase 项目中实现 运行 脚本以更新配置(env 变量)

流程如下

调用 firebase 函数-> 将参数 (bar, baz) 传递到云中 运行 -> 运行 脚本 firebase functions:config:set foo.bar=baz

我所做的是创建一个由 cloud-builders-community 共享的 firebase-tools 图像,下面是代码

// cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/firebase', '.']
images:
- 'gcr.io/$PROJECT_ID/firebase'
tags: ['cloud-builders-community']

下面是 Dockerfile

//Dockerfile

FROM node

RUN npm i -g firebase-tools
ADD firebase.bash /usr/bin
RUN chmod +x /usr/bin/firebase.bash

ENTRYPOINT [ "/usr/bin/firebase.bash" ]

所以从这里开始,我想知道如何编写 运行 脚本。 任何想法或建议将不胜感激。

云 运行 允许您托管响应 HTTP 请求的容器。

在您的设计中,您是如何设法调用您的容器的? ... 是的,您没有定义任何端点。

我为一个开源项目做出了贡献,我发现了一个可以自动为您服务的工具 bash 脚本作为 http 端点。看看这个 Dockerfile. It use the tool shell2http

对于您的情况,我建议您使用这样的 Dockerfile:

FROM node
RUN npm i -g firebase-tools
ADD my_script.sh /
COPY --from=msoap/shell2http /app/shell2http /shell2http

RUN chmod +x my_script.sh

ENTRYPOINT ["/shell2http","-export-all-vars"]
CMD ["/update","/my_script.sh"]

根据查询参数将您的 my_script.sh 写入 运行 您想要的 bash 命令。

工作示例my_script.sh

#!/bin/sh
firebase --version

并且,在构建容器并将其部署到云 运行 后,调用 https://myservice.....run.app/update?<your env var>

编辑

对于 Firebase 身份验证,您有 2 种解决方案,但在详细介绍之前,您必须按照说明生成刷新令牌 here

  1. 使用环境变量传递您的令牌。它不是最安全的,因为您的令牌以纯文本形式存入云端 运行 env var.

像这样部署您的服务

gcloud run deploy --image=... --set-env-vars=TOKEN=<tokenValue>

并像这样构建您的 my_script.sh 文件

#!/bin/sh
firebase --token $TOKEN <command>
  1. 使用secret manager。它更安全,但需要做更多的事情。首先将您的 firebase 刷新令牌保存到秘密管理器
echo "<tokenContent>" | gcloud beta secrets create --replication-policy=automatic --data-file=- myFirebaseToken

因为需要使用gcloud,所以我改变了创建容器的方式。因此这里是新容器

FROM google/cloud-sdk

RUN apt-get update && apt-get install -y nodejs npm
RUN echo $(npm i -g  firebase-tools)
RUN node -v

ADD my_script.sh /
COPY --from=msoap/shell2http /app/shell2http /shell2http
RUN chmod +x my_script.sh

ENTRYPOINT ["/shell2http","-export-all-vars"]
CMD ["/update","/my_script.sh"]

2条备注:

  • 默认的node版本是12,不知道你有没有问题
  • 节点 12 版本是 firebase 工具的一个问题,因为有 1 个依赖项已弃用。 npm i 命令以非零代码退出(构建失败)。这里的 hack 是用 echo RUN echo $(npm i -g firebase-tools) 包围命令。不是很干净,但是可以用。

现在 my_script.sh 文件

#!/bin/sh
TOKEN=$(gcloud beta secrets versions access --secret=<mySecretToken> latest)
firebase --token $TOKEN <command>