【问题标题】:Google Cloud Run - Run Shell Script in firebase projectGoogle Cloud Run - 在 firebase 项目中运行 Shell 脚本
【发布时间】:2020-10-09 05:30:09
【问题描述】:

我是 google cloud-run 的新手,我希望能够在 firebase 项目中运行脚本来更新配置(环境变量)

流程如下

调用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" ]

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

【问题讨论】:

    标签: node.js google-cloud-platform google-cloud-run


    【解决方案1】:

    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 的说明生成刷新令牌

    1. 使用 env var 传递您的令牌。这不是最安全的,因为您的令牌以纯文本形式存储在 Cloud Run 环境变量中。

    像这样部署你的服务

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

    然后像这样构建你的my_script.sh 文件

    #!/bin/sh
    firebase --token $TOKEN <command>
    
    1. 使用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>
    

    【讨论】:

    • 感谢您的回答。我很感激。所以我厌倦了没有任何参数但硬编码变量,下面是代码 ``` #!/bin/sh firebase functions:config:set hello.world=test123 ``` 我调用myservice.....run.app/update 但得到了错误消息@987654340 @ 并且我的 Dockerfile 与您建议的上述相同,也许我应该更多地研究 Docker,但对此有任何想法吗?也许入口点不对?
    • 我编辑了我的答案。经过测试,我错过了使 my_script.sh 文件可执行。看我新建的dockerfile,我直接用的是Node镜像。这是一个例子,不是强制性的。在某种情况下,它会打印 firebase 版本。
    • 谢谢。它实际上在记录 firebase 工具版本时有效。但是其他需要身份验证的 firebase 命令,例如 firebase functions:config:set 或 firebase deploy,它不起作用。
    • 非常感谢您回到这个话题并提供解决方案。我已经尝试了上述方法(选项 1),使用刷新令牌并按照建议将其保存为 env var。但仍然得到这些exec error: exit status 1 我认为我的 shell 脚本语法不正确,但不知道出了什么问题。 firebase --token $TOKEN use test-123 &amp;&amp; firebase --token $TOKEN functions:config:set foo.bar=baz 我也试过不使用&amp;&amp;,但也没有用。如果您能建议在 my_script.sh 中需要修复什么,我将不胜感激。
    • 容器构建成功了吗?服务部署好了吗?您在哪里看到此错误跟踪?
    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 2018-09-11
    • 2020-10-01
    • 1970-01-01
    • 2020-04-08
    相关资源
    最近更新 更多