前言
由于現(xiàn)在需要部署Nginx的Docker,希望nginx配置文件里面有關(guān)server_name在啟動容器前動態(tài)修改。
但是由于nginx的配置文件不支持使用環(huán)境變量。網(wǎng)上找了好些方案,最終選擇使用envsubst的方式改寫nginx配置文件。
學(xué)習(xí)envsubst
envsubst就是將環(huán)境變量替換文件里面指定標記的值。
例如有如下文件env.conf,內(nèi)容如下
[test]
ip = ${ip}
port = ${port}
url = http://${ip}:${port}/index.html
phone = ${phone}
當(dāng)執(zhí)行export ip=192.168.1.5,export port=8081,export phone=13522223334寫入環(huán)境變量。
然后執(zhí)行envsubst < env.conf > env.new.conf,就可以生成如下的env.new.conf
[test]
ip = 192.168.1.5
port = 8081
url = http://192.168.1.5:8081/index.html
phone = 13522223334
還可以指定只替換部分環(huán)境變量,source env.env && envsubst '$ip;$phone' < env.conf,這樣只會替換ip和phone這兩個變量。
上面只替換部分環(huán)境變量,在linux測試只能用單引號,用雙引號無效,分隔符試過, . ; |這四種都可以,我估計還有更多分隔符。
應(yīng)用nginx配置文件
docker-compose.yml文件如下
version: "3"
services:
nginx:
image: nginx:1.20.1-alpine
container_name: nginx
ports:
- 80:80
- 443:443
environment:
- NGINX_HOST=www.janbar.com
- NGINX_PORT=80
volumes:
- /root/janbar.temp:/etc/nginx/conf.d/janbar.temp
command: /bin/sh -c "envsubst < /etc/nginx/conf.d/janbar.temp > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
network_mode: bridge
restart: always
/root/janbar.temp文件內(nèi)容如下
server {
listen ${NGINX_PORT};
listen [::]:${NGINX_PORT};
server_name ${NGINX_HOST};
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
按照上述docker-compose.yml配置文件最終生成docker容器里面的配置文件如下cat
/etc/nginx/conf.d/default.conf
server {
listen 80;
listen [::]:80;
server_name www.janbar.com;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
總結(jié)
經(jīng)過上述騷操作,最終可以通過環(huán)境變量的方式更新nginx的docker容器內(nèi)部配置文件。大功告成!