Docker AWK复制行并替换占位符
我在docker入口点脚本(alpine busybox)中使用awk 我的目标是将参数传递给nginx上游服务器指令。所以我有一个模板文件:Docker AWK复制行并替换占位符,docker,awk,Docker,Awk,我在docker入口点脚本(alpine busybox)中使用awk 我的目标是将参数传递给nginx上游服务器指令。所以我有一个模板文件: upstream config { ip_hash; server $UPSTREAMS:18280; } upstream application { ip_hash; server $UPSTREAMS:18380; } .... and so on .... 正如您所看到的,应用程序和DB不在docker中(否则我只使用trae
upstream config {
ip_hash;
server $UPSTREAMS:18280;
}
upstream application {
ip_hash;
server $UPSTREAMS:18380;
}
.... and so on ....
正如您所看到的,应用程序和DB不在docker中(否则我只使用traefik)
最终配置文件应如下所示(基于传递的env变量):
问题是“服务器”(节点)的数量可能会随时间和使用情况而变化,例如:
- 开发人员在工作站上运行nginx docker容器(1个节点)
- 开发环境(1-2个节点)
- 测试环境(2个节点)
- 产品环境(3个节点)
- 等等
#!/bin/busybox sh
array=${UPSTREAMS//;/ }
set -- $array
while [ -n "$1" ]; do
server_node=$1
awk '/\$UPSTREAMS/ { print; gsub("\\$UPSTREAMS", "$server_node")};1' upstreams.template > upstreams.intermediate
shift
done
谢谢你的帮助:)
PS:很抱歉缺少v UPSTREAMS变量内容:
ENV UPSTREAMS="node1;node2;node3"
工作版本
感谢您,我能够更正脚本:
#!/bin/busybox sh
export UPSTREAMS
export SERVER
upstreams=${UPSTREAMS//;/ }
set -- $upstreams
while [ -n "$1" ]; do
server=$1
awk -v var="$server" '/\$UPSTREAMS/ { print; gsub(/\$UPSTREAMS/, var)};1' /etc/nginx/templates/upstreams.template > /tmp/tmp \
&& mv /tmp/tmp /etc/nginx/templates/upstreams.template
shift
done
awk '!/\$UPSTREAMS/' /etc/nginx/templates/upstreams.template
mv /etc/nginx/templates/upstreams.template /etc/nginx/conf.d/upstreams.final
.....
输出:
upstream config {
ip_hash;
server node3:18280;
server node2:18280;
server node1:18280;
}
非常感谢您的评论:)
你能更改模板文件吗?
upstream config {
ip_hash;
server node3:18280;
server node2:18280;
server node1:18280;
}
$ cat file
upstream config {
ip_hash;
server $UPSTREAMS:18280;
}
upstream application {
ip_hash;
server $UPSTREAMS:18380;
}
$ cat tst.sh
#!/usr/bin/env bash
UPSTREAMS='node1;node2;node3'
tmp=$(mktemp) || exit 1
awk -v upstreams="$UPSTREAMS" '
BEGIN {
numServers = split(upstreams,servers,/;/)
}
/\$UPSTREAMS/ {
orig = $0
for (serverNr=1; serverNr<=numServers; serverNr++) {
server = servers[serverNr]
$0 = orig
sub(/\$UPSTREAMS/,server)
print
}
next
}
{ print }
' file > "$tmp" && mv -- "$tmp" file
$ ./tst.sh
$ cat file
upstream config {
ip_hash;
server node1:18280;
server node2:18280;
server node3:18280;
}
upstream application {
ip_hash;
server node1:18380;
server node2:18380;
server node3:18380;
}
$