一條nginx命令引發(fā)的對于容器的思考

去年的時候?qū)懥艘黄瓌?chuàng)《前后端分離,如何在前端項目中動態(tài)插入后端API基地址?(in docker)》, 我自認(rèn)為這篇生產(chǎn)實踐是對大前端、 容器化、CI/CD的得意之作。
對于前后端分離的web項目,在容器啟動的瞬間,通過腳本替換待部署環(huán)境的特定變量,形成了一個鏡像,多環(huán)境部署的效果。

Dockerfile ?CMD指示容器運(yùn)行過程:
用真實值替換前端chunk files中插入的API_BASE_URL字符 使用nginx承載替換后的chunk files
#?FILE:?Dockerfile
...
EXPOSE?80
COPY?--from=builder?/react-frontend/replace_api_url.sh?/
CMD?["sh",?"replace_api_url.sh"]
下面是replace_api_url.sh的內(nèi)容
#!/usr/bin/env?sh
find?'/usr/share/nginx/html'?-name?'*.js'?-exec?sed?-i?-e?'s,API_BASE_URL,'"$API_BASE_URL"',g'?{}?\;
nginx?-g?"daemon?off;"


? 為什么要加 nginx -g "daemon ?off;"
在常規(guī)的虛機(jī)上,nginx默認(rèn)是以守護(hù)進(jìn)程來運(yùn)行的(daemon on),在后臺默默提供服務(wù),同時部署多個ngxin服務(wù)也不會相互干擾。
在容器環(huán)境,one container == ?one ?process,容器要能持續(xù)運(yùn)行,必須有且僅有一個前臺進(jìn)程,所以對nginx進(jìn)程容器化,需要將nginx轉(zhuǎn)為前后進(jìn)程( daemon off)。
“我們能順利執(zhí)行docker run nginx,啟動容器并不退出,是因為nginx的官方鏡像Dockerfile[1] 已經(jīng)指定 nginx -g "daemon off;"
再回到上文,為什么此處腳本中要加"nginx ?-g ?"daemon off;" 呢?
“If you add a custom CMD in the Dockerfile, be sure to include -g daemon off; in the CMD in order for nginx to stay in the foreground, so that Docker can track the process properly (otherwise your container will stop immediately after starting)!
CMD在執(zhí)行的shell腳本["sh", "replace_api_url.sh"],實際上是啟動shell進(jìn)程來執(zhí)行,腳本執(zhí)行完,進(jìn)程就會退出(此時nginx還是一攤死的物理文件),
所以我們要在腳本內(nèi)再添加nginx -g "daemon off;"?,將整個shell進(jìn)程轉(zhuǎn)為前臺能持續(xù)運(yùn)行的進(jìn)程。
Last
容器= 進(jìn)程, 有且僅有一個前臺能持續(xù)運(yùn)行的進(jìn)程 nginx 默認(rèn)是后臺守護(hù)進(jìn)程的形式運(yùn)行, nginx -g ?"daemon off;" 以前臺形式持續(xù)運(yùn)行。


參考資料
nginx的官方鏡像Dockerfile: https://github.com/nginxinc/docker-nginx/blob/master/Dockerfile-alpine.template
●前后端分離,如何在前端項目中動態(tài)插入后端API基地址?(in docker)
●掌握了Docker Layer Caching才敢自稱精通Dockerfile
●如何利用Gitlab-CI持續(xù)部署到遠(yuǎn)程機(jī)器?
●分享我在前后端分離項目中Gitlab-CI的經(jīng)驗
●基于docker-compose的Gitlab CI/CD實踐&排坑指南

點(diǎn)個在看你最好看

