Cloud Run 允许您托管响应 HTTP 请求的容器。
在您的设计中,您是如何设法调用容器的? ...是的,您没有定义任何端点。
我为一个开源项目做出了贡献,我发现了一个工具,它可以自动为您提供 bash 脚本作为 http 端点。看看这个Dockerfile。它使用工具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
并且,在构建容器并将其部署到 Cloud Run 之后,调用 https://myservice.....run.app/update?<your env var>
编辑
对于 Firebase 身份验证,您有 2 个解决方案,但在详细介绍之前,您必须按照 here 的说明生成刷新令牌
- 使用 env var 传递您的令牌。这不是最安全的,因为您的令牌以纯文本形式存储在 Cloud Run 环境变量中。
像这样部署你的服务
gcloud run deploy --image=... --set-env-vars=TOKEN=<tokenValue>
然后像这样构建你的my_script.sh 文件
#!/bin/sh
firebase --token $TOKEN <command>
- 使用secret manager。它更安全,但需要做更多的事情。首先将您的 Firebase 刷新令牌保存到 Secret Manager 中
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 备注:
- 默认节点版本是12,不知道是不是你的问题
- node 12 版本是 firebase 工具的一个问题,因为有 1 个依赖项已弃用。并且
npm i 命令以非零代码退出(并且构建失败)。这里的技巧是用 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>