envsubst命令, 并实现docker下nginx动态配置

使用

1
2
3
4
# 添加环境变量
export myname=pangxieke
# 查看
env | grep myname

使用

1
2
3
echo $myname
# 注意单引号包裹的时候代表是字符串
echo "$myname"

通过envsubst用环境变量替换掉了字符串$myname

1
echo '$myname' | envsubst

进阶使用

新建一个测试文件echo '我的名字=$myname' > one

将one文件的内容输入到envsubst envsubst '$myname' < one

将内容输出到two文件中envsubst '$myname' < one > two, 查看cat two

常见应用

新建.env文件

1
echo "PORT=9998" > .env

创建中间文件, source.template 方便查看并将defalut.conf置空

cp defalut.conf source.template 注意这里中间文件不要用.conf结尾 会被nginx加载
echo "" > defalut.confdefalut.conf内容清空

source.template

1
2
3
4
5
6
7
8
9
10
11
12
upstream index {
server xx.xx.xx.xx:${PORT};
}
server {
listen 80;
charset utf-8;
server_name 127.0.0.1;

location / {
proxy_pass http://index/test;
}
}

修改docker-compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
version: "3"
services:
nginx:
restart: always
image: daocloud.io/library/nginx:1.13.1
container_name: test-nginx
ports:
- 81:80
volumes:
- /home/tangys/local/docker/nginxtest/conf.d:/etc/nginx/conf.d
environment:
PORT: # 默认读取到.env的配置
command:
- /bin/bash
- -c
- "envsubst \
'$$PORT' \ # 这里的PORT是容器内的PORT环境变量
< /etc/nginx/conf.d/source.template \ # 中间文件内容读出 并通过envsubst来替换$PORT
> /etc/nginx/conf.d/default.conf \ # 全部输入到default.conf
&& exec nginx -g 'daemon off;'"

查看defalut.conf,可以看到端口号已经被填写

1
2
3
4
5
6
7
8
9
10
11
12
upstream index {
server 192.168.0.85:9999;
}
server {
listen 80;
charset utf-8;
server_name 127.0.0.1;

location / {
proxy_pass http://index/test;
}
}

修改 .env文件的配置 可以动态切换接口

原文

https://www.codeleading.com/article/27874801193/

https://www.linux-man.cn/command/envsubst/

螃蟹 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
坚持原创技术分享,您的支持将鼓励我继续创作!