envsubst, 为nginx容器引入自定义环境变量
envsubst的用法简介:
#添加测试变量
export myname=Leon
#查看结果。
注意上述单引号的用法,使用单引号代表字符串,而非变量。
新建测试文件t1.txt
将t1.txt文件内容输入envsubst,并输出到t2.txt
应用到nginx容器的例子:我需要在nginx.conf里引用一个自定义变量PT_IP,但是nginx默认不支持直接引用变量,这里用envsubst来转换。
如下为我的docker-compose.yml关于nginx的配置:
nginx:
image: nginx:latest
container_name: My_Nginx
ports:
- "8001:8001"
network_mode: "host"
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- ./nginx/conf.d/factory.conf.template:/etc/nginx/conf.d/factory.conf.template
//注意这里,宿主机conf.d目录下文件不能使用后缀为conf的文件,需更改后缀为tmplate或其它名称。因为容器启动后,envsubst会替换factory.conf.template为factory.conf。
- ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/log:/var/log/nginx
environment:
PT: //缺省读取与yaml文件同级目录里的.env文件里的PT值。
depends_on:
- redis
- mysql
command: /bin/sh -c "envsubst '$$PT' < /etc/nginx/conf.d/factory.conf.template > /etc/nginx/conf.d/factory.conf && exec nginx -g 'daemon off;'"
// ‘$$PT’ 这个是映射到容器内部的环境变量,格式必须这样写。
// /etc/nginx/conf.d/factory.conf.template 读出中间文件template的内容,并通过envsubst来替换变量$PT
// /etc/nginx/conf.d/factory.conf 转换变量$PT后的值输入正式文件factory.conf
restart: always
………………………
容器启动后,进入容器查看变量是否替换成功。cat /etc/nginx/conf.d/factory.conf //这个正式的文件,只能在容器内部看到,宿主机上看不到。宿主机上看到的是template的中间文件。
如果你的nginx里有多个server,即有好几个conf文件需要转换变量。可以使用command命令
1. 启动nginx.conf里的include功能,红框所示。
2. 使用command引用脚本来执行对多个conf.template文件的变量转换。我在宿主机的./nginx/conf.d里创建了脚本文件main.sh,映射到/etc/nginx/conf.d/main.sh。
脚本如下所示:cat main.sh
#!/bin/bash
envsubst '$$A' < /etc/nginx/conf.d/factory.conf.template > /etc/nginx/conf.d/factory.conf
envsubst '$$B' < /etc/nginx/conf.d/app.conf.template > /etc/nginx/conf.d/app.conf
exec nginx -g 'daemon off;'
结束。