【问题标题】:How to retain existing env variables in a new shell如何在新的 shell 中保留现有的环境变量
【发布时间】: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


【解决方案1】:

好吧,我想通了。

我们使用的是 TypeORM,最初使用的是 ormconfig.json 文件。事实证明,这仍然以某种方式在系统上被拾取,并覆盖了所有 env 变量。

发布此回复以帮助其他人,以防他们犯同样的错误。

【讨论】:

    猜你喜欢
    • 2013-01-22
    • 2021-01-01
    • 1970-01-01
    • 2020-02-16
    • 2012-01-27
    相关资源
    最近更新 更多