nginx -g "daemon off;" 你学废了吗?
去年的时候写了一篇原创《前后端分离,如何在前端项目中动态插入后端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服务也不会相互干扰。
nginx -g directives: set global directives out of configuration file.
在容器环境,one container == one process,容器要能持续运行,必须有且仅有一个前台进程,所以对nginx进程容器化,需要将nginx转为前后进程( daemon off)。
我们能顺利执行docker run nginx,启动容器并不退出,是因为nginx的官方镜像Dockerfile 已经指定 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;" 以前台形式持续运行。
2022/06/14 ---
有个误区,我一直以为一个容器只能有一个进程, 其实是推荐作法。
在某些时候,两个program结合的很紧密的时候,也可以做成单容器内多进程。
** 无论如何,保持一个前台进程 **
https://docs.docker.com/config/containers/multi-service_container/
本文来自博客园,作者:{有态度的马甲},转载请注明原文链接:https://www.cnblogs.com/JulianHuang/p/15753732.html
欢迎关注我的原创技术、职场公众号, 加好友谈天说地,一起进化
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~