【发布时间】:2022-01-10 21:44:27
【问题描述】:
我知道我一定是在做一些傻事,但我正在尝试将环境变量传递给 Cloud Build 中在 /bin/sh -c 下运行的命令。
我的 Cloud Build 文件如下所示:
- id: db-migrate
name: node:16.13.0
dir: 'packages/backend'
entrypoint: '/bin/sh'
args:
- '-c'
- '(/workspace/cloud_sql_proxy -dir=/workspace -instances=$_DB_CONNECTION=tcp:127.0.0.1:5432 & sleep 2) && yarn db:migrate'
env:
- 'DB_HOST=127.0.0.1'
- 'DB_USER=$_DB_USER'
- 'DB_PASSWORD=$_DB_PASSWORD'
- 'DB_NAME=$_DATABASE'
我的 Cloud Build Trigger 设置了替换,当我查看构建详细信息时,它会显示已设置的环境变量。
但是,yarn db:migrate 命令的行为就像没有设置环境变量一样。我相信这是因为它们没有从机器传递到命令。
知道我做错了什么吗?
这里的问题是,当我们调用 bin/sh 时,它会创建一个带有它自己的环境变量的新 shell。当我阅读有关 SH/Dash 的手册时,我将把这个问题留在这里: 如何在新的 shell 中保留现有的环境变量?
【问题讨论】:
-
尝试用 " " 而不是 ' ' 换行,前者在 bash 脚本中将 $ 转换为文字字符串
-
同时验证 /bin/sh 指向 /bin/bash
-
@ChristopherHoffman 这些是 YAML 引号,而不是 shell 引号。但这提出了一个问题,
$_DB_USER、$_DB_PASSWORD和$_DATABASE是否会被 Cloud Build 扩展?它们不是 shell 参数,因此没有理由相信它们会被扩展为 shell 变量。 -
@chepner 可能有更简单的方法,然后我会使用 shell 脚本构建 YAML 文件,这将扩展环境变量
-
真正的问题是,
_DB_USER等人在哪里?首先得到定义?您也许可以使用 YAML 引用,或者您可以考虑使用 Secret Manager,或者动态生成 Cloud Build 文件,或者其他一些选项。
标签: bash shell environment-variables google-cloud-build cloudbuild.yaml