Bash变量注入

Bash variable injection

我正在尝试想出一种使用环境变量为 docker 图像参数化某些配置文件的方法。示例输入文件可能类似于:

<database>
  <host>${DB_HOST}</host>
  <name>${DB_NAME}</name>
  <user>${DB_USER}</user>
  <pass>${DB_PASSWORD}</pass>
</database>

并且我希望输出基本上完全相同,但字段中填充了相应的环境变量值。

在 bash 中是否有直接执行此操作的简单方法?我使用的系统本身不支持 env vars,所以我需要手动编写这些配置文件,但我需要为我所在的每个环境注入不同的 vars,所以我并不是特别想实际维护真实每个环境的文件。

这是 简单如:

cat<<EOF > new_config_file
<database>
  <host>${DB_HOST}</host>
  <name>${DB_NAME}</name>
  <user>${DB_USER}</user>
  <pass>${DB_PASSWORD}</pass>
</database>
EOF

ls -l new_config_file

您正在寻找 envsubst

$ envsubst < config_template > config_instance

只是另一种选择。

我生成的配置文件通常只需要一点逻辑 + 嵌入环境变量内容。在某些时候,我厌倦了每次都重新发明轮子,并在 Go 中拼接了一个名为 Templeter (https://github.com/reertech/templater) 的简单工具。

对于大多数系统来说,它只是一个独立的零依赖二进制文件,因此您可以下载它并像这样使用 Go 模板语言 (https://golang.org/pkg/text/template/):

#!/bin/bash

YEAR=1997 \
NAME=John \
SURNAME=Connor \
./templater -t - -o /tmp/hello.txt <<EOF
Hello, {{env "NAME"}} {{env "SURNAME"}}!
{{ if env "YEAR" | parseInt | eq 1997 }}
Have a nice Judgement Day!
{{ end }}
EOF

如果您对预构建的二进制文件不满意,可以使用 Go 并自己构建一个。

希望这对您或其他无法仅通过环境替换来削减它并且不喜欢抨击的人有所帮助。