Docker AWK复制行并替换占位符

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

我在docker入口点脚本(alpine busybox)中使用awk

我的目标是将参数传递给nginx上游服务器指令。所以我有一个模板文件:

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个节点)
  • 等等
以及我最新尝试的entrypoint脚本:

#!/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;
}
$