代码之家  ›  专栏  ›  技术社区  ›  Jan

如何将变量从不同的NetDotEnv环境文件(如envsubst)渲染到目标文件中

  •  0
  • Jan  · 技术社区  · 4 年前

    我所有的环境都有。环境文件。 当我打开外壳终端时,它们会自动加载。

    我通常使用 envsubst .与下面的示例类似。

    我搜索的是一个解决方案,我可以通过 dotenv -把我的 template -文件转换为输出渲染结果的脚本。

    比如:

    aScript --input .env.production --template template-file.yml --output result.yml
    

    我希望能够将不同的环境变量解析到yaml中。输出应该通过“密封的秘密”进行密封,并最终保存在Tomize文件夹中

    envsub.sh .env.staging templates/secrets/backend-secrets.yml | kubeseal -o yaml > kustomize/overlays/staging
    

    我希望你能明白。


    实例

    .env.production -文件:

    FOO=bar PASSWROD=abc

    内容 template-file.yml

    stringData:
      foo: $FOO
      password: $PASSWORD
    

    然后运行这个:

    envsubst < template-file.yml > file-with-vars.yml
    

    结果是:

    stringData:
      foo: bar
      password: abc
    

    到目前为止,我的方法不起作用,因为Dotenv还支持 不同的环境 喜欢 .env , 埃文先生。生产 , .env.staging asf。。

    0 回复  |  直到 4 年前
        1
  •  1
  •   dan    4 年前

    那么:

    #!/bin/sh
    
    # envsub - subsitute environment variables
    
    env=$1
    template=$2
    
    sh -c "
    . \"$env\"
    
    cat <<EOF
    $(cat "$template")
    EOF"
    

    用法:

    ./envsub .env.production template-file.yaml > result.yaml
    
    • 带有不带引号分隔符的here doc( EOF )展开变量,同时保留引号、反斜杠和其他shell序列。
    • sh -c 用起来像 eval ,以展开命令替换,然后通过here doc运行该输出。
    • 请注意,如果有人可以修改yaml文件,这种额外级别的间接寻址可能会产生代码注入。

    例如,添加以下内容:

    EOF
    echo malicous commands
    

    但它确实得到了你想要的结果。