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

cf9392eac90ad7f2da17081cc97e1cb9.gif

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

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

5e6fa4ed1fc52d9c1d057f28c0c52686.png

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;"

113e59d31aae9feb9abc3a0c44a3abbd.pngf28d24c6a50c680ee6dd3443809b6f9b.png09ec38cbeadc4cd82e2a3cacbd340db6.png  为什么要加 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!f09a11e4096738833c0da7b237e9907b.pnge9545e3114ca91d54ee6a82be3fcbbbd.png

参考资料

[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流程

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

12a6bc5668979490667dc78db15d62a9.png

点个在看你最好看

0655a3a31450cdddc313be77874990f7.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有态度的马甲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值