我正在部署一个使用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"
注意:只需在首次部署服务时执行此操作一次,而不是在每次部署修订版时执行此操作