我正在开发我们的一个应用程序,将 Docker 镜像从使用每个环境的静态配置更新为使用 awk 动态变量插入的单个模板。我们的 Dockerfile 调用一个脚本,该脚本回显从名为 values.yaml 的文件中提取的每个变量,然后使用 awk 将 template.conf 文件中出现的每个变量名称替换为 yaml 文件中的值。除了一个变量的值中包含“&”之外,它运行良好。这是一个基本布局:
脚本.sh:
echo '***DEBUG***'
echo MY_VAR - ${MY_VAR}
echo '***END DEBUG***'
#Insert variable
awk -i inplace '{ gsub(/MY_VAR/, ENVIRON["MY_VAR"]); print }' template.conf
值.yaml:
envvars:
MY_VAR: "foo&bar"
模板.conf:
Sometext: MY_VAR
输出:
***DEBUG***
MY_VAR - foo&bar
***END DEBUG***
Sometext: fooMY_VARbar
我希望这足以说明我的问题。我理解原因是 awk 将“&”字符解释为元数据,而不是文字字符,因此它替换了字符所在的变量的名称。我不知道如何阻止这种情况发生。我尝试了以下替代的 awk 命令,但似乎都没有什么区别:
awk -i inplace '{ gsub(/MY_VAR/, gensub(/&/, "\\&", "g", ENVIRON["MY_VAR"])) }; { print }' template.conf
awk -i inplace '{ gsub("MY_VAR", ENVIRON["MY_VAR"]); print }' template.conf
我在论坛上搜索了一下,但没有找到有关这个特定问题的任何信息,所以如果这是一个重复的问题,我深表歉意。
答案1
Perl 来救援!
perl -pe 's/MY_VAR/$ENV{MY_VAR}/g'
否则,您必须在运行 awk 之前转义变量中的特殊字符,例如
MY_VAR=${MY_VAR//&/\\&}
请注意,需要转义的字符可能不止一个&
。