一条nginx命令引发的对于容器的思考
去年的時候寫了一篇原創《前后端分離,如何在前端項目中動態插入后端API基地址?(in docker)》, 我自認為這篇生產實踐是對大前端、 容器化、CI/CD的得意之作。
對于前后端分離的web項目,在容器啟動的瞬間,通過腳本替換待部署環境的特定變量,形成了一個鏡像,多環境部署的效果。
Dockerfile ?CMD指示容器運行過程:
用真實值替換前端chunk files中插入的API_BASE_URL字符
使用nginx承載替換后的chunk files
下面是replace_api_url.sh的內容
#!/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;"
在常規的虛機上,nginx默認是以守護進程來運行的(daemon on),在后臺默默提供服務,同時部署多個ngxin服務也不會相互干擾。
在容器環境,one container == ?one ?process,容器要能持續運行,必須有且僅有一個前臺進程,所以對nginx進程容器化,需要將nginx轉為前后進程( daemon off)。
“我們能順利執行docker run nginx,啟動容器并不退出,是因為nginx的官方鏡像Dockerfile[1] 已經指定 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在執行的shell腳本["sh", "replace_api_url.sh"],實際上是啟動shell進程來執行,腳本執行完,進程就會退出(此時nginx還是一攤死的物理文件),
所以我們要在腳本內再添加nginx -g "daemon off;"?,將整個shell進程轉為前臺能持續運行的進程。
Last
容器= 進程, 有且僅有一個前臺能持續運行的進程
nginx 默認是后臺守護進程的形式運行, nginx -g ?"daemon off;" 以前臺形式持續運行。
今天是2021年的最后一天,這也是馬甲哥的134篇原創深度技術文章,馬甲哥今年時間有限, 寫的文章連貫性不夠、技能點犬牙交錯,我自己回頭看之前的文章,一坨翔, 也歡迎童鞋們加我好友(hihuangjun) 進群懟我。
后面會整理幾篇復盤文章, 幫助童鞋們整理頭緒,加深印象, 新的一年,忘掉過去的不悅,開啟新氣象。??Happy Year!
參考資料
[1]
nginx的官方鏡像Dockerfile: https://github.com/nginxinc/docker-nginx/blob/master/Dockerfile-alpine.template
●前后端分離,如何在前端項目中動態插入后端API基地址?(in docker)
●掌握了Docker Layer Caching才敢自稱精通Dockerfile
●如何向K8s,Docker-Compose注入鏡像Tag
●如何利用Gitlab-CI持續部署到遠程機器?
●鵝廠二面,Nginx回憶錄
●分享我在前后端分離項目中Gitlab-CI的經驗
●基于docker-compose的Gitlab CI/CD實踐&排坑指南
●大揭秘| 我司項目組Gitlab Flow && DevOps流程
●難纏的布隆過濾器,這次終于通透了
點個在看你最好看
總結
以上是生活随笔為你收集整理的一条nginx命令引发的对于容器的思考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET 6 中的 Logging So
- 下一篇: 日志文件记录的重要性