环境变量中的 Google Cloud Run 和 JSON



我正在部署一个使用config的小型 Node.js 应用程序。 读取NODE_CONFIG并用于取代任何本地配置。这在部署具有机密的服务时非常方便,因为可以从外部注入配置。

尝试使用Google Cloud Run和CLI实现此目的时,我收到转义错误。显然,CLI 仅支持字典。

有没有更好的方法通过 env 变量传递JSON内容?

gcloud run deploy pr-$PULL_REQUEST 
--platform=managed 
--revision-suffix=$revision 
--region us-central1 
--set-env-vars="NODE_ENV=development,NODE_CONFIG='$json'" 
--allow-unauthenticated 
--image gcr.io/...

如果您有多个环境变量,并且坚持在 CLI 上列出环境变量gcloud(而不是使用 YAML + 使用gcloud alpha run services replace编写服务对象(,您可以简单地重复--set-env-vars

gcloud run deploy 
--set-env-vars="A=B" 
--set-env-vars="C=D" 
--image=gcr.io/cloudrun/hello

在这里,您可以简单地使用周围的引号进行"KEY=$value"

引用值 1( 防止参数在包含空格的情况下拆分$value并且 2( 转义$value中的引号,因为您有一个 json 值。


json='{"hello":"world"}'
gcloud run deploy foo 
--set-env-vars="A=$json" 
--set-env-vars="C=D" 
--image=gcr.io/cloudrun/hello

gcloud run services describe [...]输出:

Env vars:
A                {"hello":"world"}
C                D

事实上,它不适用于 CLI。当您在 2 个值之间设置逗号时,它不起作用。

您可以使用@Kolban解决方案,在GCS中创建文件,并且仅在EnvVar中引用此文件。但此解决方案意味着更新您的代码以从云存储获取和读取文件(更多角色,执行更多部署(。但它有效,我使用此模式将SQL查询传递给我的Cloud Run服务,直到现在,这是唯一的解决方案!

但是,有一个新的测试版解决方案,自 2 周以来可用:您可以使用services replace功能。此功能仅允许您提供用于描述服务的 yaml 文件。当然,这个 YAML 符合 knative API,因此是标准的。

我用 JSON 进行了测试,它可以工作,但这意味着您的部署过程发生了一些变化(使用图像和 env var 创建 YAML 文件(。首先,创建一个最小的 YAML 文件(例如命名为:jsonenv.yaml(

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
#Name of the service
name: jsonenv
spec:
template:
spec:
containers:
- env:
- name: NODE_CONFIG
value: '{"1":"2","3":"4"}'
image: gcr.io/PROJECT_ID/CONTAINER_NAME

然后使用此命令

gcloud beta run services replace jsonenv.yaml --platform managed --region WHERE_YOU_WANT

这行得通。希望这能解决您的问题。

编辑

要命名修订版,您可以在template中添加metadata.name,如下所示:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
#Name of the service
name: jsonenv 
spec:
template:
metadata:
#Name of the revision
name: my-revision-name
spec:
containers:

但是,您无法使用此命令管理 IAM 角色。因此,--allow-unauthenticated不能与替换一起使用。您必须手动设置此授权

gcloud run services add-iam-policy-binding jsonenv 
--member="allUsers" 
--role="roles/run.invoker"

注意:只需在首次部署服务时执行此操作一次,而不是在每次部署修订版时执行此操作

相关内容

最新更新