江蘇 做網(wǎng)站推廣目標(biāo)怎么寫(xiě)
本文介紹了使用Docker環(huán)境變量動(dòng)態(tài)配置nginx。采用的是通過(guò)docker?run?-e?xxxx=xxx先往容器注入環(huán)境變量,然后進(jìn)一步通過(guò)envsubst指令將環(huán)境變量寫(xiě)入到conf文件中,實(shí)現(xiàn)動(dòng)態(tài)配置文件內(nèi)容。
背景
前后端分離的架構(gòu)下,經(jīng)常會(huì)用到nginx反向代理來(lái)解決跨域問(wèn)題。部署時(shí),同一份前端代碼有時(shí)候會(huì)根據(jù)開(kāi)發(fā)環(huán)境不同,切換不同的后端接口地址進(jìn)行代理,或者會(huì)部署到不同的環(huán)境中。這些都需要配置不同的后端地址,想法是打包好的鏡像不需要改動(dòng),部署到不同的環(huán)境時(shí),啟動(dòng)docker容器時(shí),注入不同的后端地址。
實(shí)現(xiàn)
以前端打包好的dist文件夾開(kāi)始,dist文件夾同級(jí)放Dockerfile和nginx.tmpl文件,
Dockerfile文件內(nèi)容
FROM nginx:alpineCOPY dist/ /usr/share/nginx/htmlCOPY nginx.tmpl /etc/nginx/conf.dEXPOSE 80WORKDIR /etc/nginx/conf.dENTRYPOINT envsubst '$APP_ROOT' < nginx.tmpl > default.conf && cat default.conf && nginx -g 'daemon off;'
?nginx.tmpl文件內(nèi)容
server {listen 80;location / {root /usr/share/nginx/html;try_files $uri $uri/ /index.html;index index.html;}location /api/ {proxy_read_timeout 200s;proxy_send_timeout 200s;proxy_pass $APP_ROOT;proxy_set_header Host $host:$server_port;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
這里實(shí)現(xiàn)環(huán)境變量注入的核心原理是利用linux自帶的envsubst指令。envsubst '$APP_ROOT' < nginx.tmpl作用是取環(huán)境的$APP_ROOT的值注入到nginx.tmpl模板里對(duì)應(yīng)的位置,然后后半句> default.conf是將替換好變量后的模板內(nèi)容寫(xiě)入到docker容器內(nèi)/etc/nginx/conf.d文件夾下的default.conf文件里。cat default.conf這句話(huà)方便我們查看nginx的配置內(nèi)容,也可以不加。
執(zhí)行docker build -t xxxxx:vvv .打包鏡像
執(zhí)行docker run -e APP_ROOT=http://xxx.xxx.xxx.xxx:yyy/ xxxxx:vvv 運(yùn)行容器,通過(guò)-e將后端服務(wù)地址通過(guò)APP_ROOT環(huán)境變量注入
通過(guò)docker logs xxxxxx 查看docker日志,可以看到通過(guò)cat default.conf輸出的內(nèi)容,可以看到nginx.tmpl里面的$APP_ROOT被注入的環(huán)境變量替換掉了。
說(shuō)明
鏡像的基礎(chǔ)鏡像nginx:alpine中,nginx的配置文件在/etc/nginx/nginx.conf文件,打開(kāi)查看內(nèi)容,
可以看到include這個(gè),包含了所有conf.d目錄下的所有conf文件,所以我們修改的文件放在了conf.d目錄下。
另外還有一點(diǎn)很重要,docker啟動(dòng)時(shí)的命令行注入的環(huán)境變量-e APP_ROOT=http://xxx.xxx.xxx.xxx:yyy/,一定要以/結(jié)尾,否則,轉(zhuǎn)發(fā)到后端時(shí),不會(huì)把/api前綴去掉,我一開(kāi)始沒(méi)有注意這個(gè)細(xì)節(jié)問(wèn)題,被困擾了很長(zhǎng)時(shí)間才搞定。這兒也可以用更詳細(xì)的rewrite實(shí)現(xiàn)。