社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  NGINX

一条nginx命令引发的对于容器的思考

dotNET跨平台 • 2 年前 • 283 次点击  

去年的时候写了一篇原创《前后端分离,如何在前端项目中动态插入后端API基地址?(in docker)》, 我自认为这篇生产实践是对大前端、 容器化、CI/CD的得意之作。

对于前后端分离的web项目,在容器启动的瞬间,通过脚本替换待部署环境的特定变量,形成了一个镜像,多环境部署的效果。

Dockerfile  CMD指示容器运行过程:

  • 用真实值替换前端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的内容

#!/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流程

难缠的布隆过滤器,这次终于通透了


点个在看你最好看


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/125293
 
283 次点击