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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 我自认为这篇生产实践是对大前端、 容器化、CI/CD的得意之作。

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


0356300386181e2015aa7486bdb5465b.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;"


为什么要加 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;" 以前台形式持续运行。



相关文章
|
10天前
|
Shell Linux Docker
docker常用命令大全(基础、镜像、容器、数据卷)
这些命令仅仅是 Docker 命令行工具的冰山一角,但对于日常操作来说已经非常全面。通过熟练地使用这些基础命令,用户可以有效地管理 Docker 的镜像、容器、数据卷和网络。随着用户对 Docker 的深入使用,更高级的命令和选项将会变得必需,但上面列出的命令已经为用户提供了一个坚实的起点。对于初学者来说,理解和掌握这些常用命令是深入学习 Docker 的基础。
110 5
docker常用命令大全(基础、镜像、容器、数据卷)
|
21天前
|
应用服务中间件 nginx
Nginx命令配置到系统环境变量
Nginx命令配置到系统环境变量
|
1月前
|
NoSQL 关系型数据库 MySQL
linux服务器重启php,nginx,redis,mysql命令
linux服务器重启php,nginx,redis,mysql命令
34 1
|
1月前
|
监控 Linux 数据处理
Linux中的nsenter命令:深入容器内部,实现无缝交互
`nsenter`是Linux工具,用于进入容器的命名空间,实现与容器内环境的交互。它基于Linux内核的命名空间功能,支持网络、PID等多类型隔离。`nsenter`允许在不停止容器的情况下调试和操作,如 `-t` 指定PID进入命名空间,`-n` 进入网络命名空间。示例包括使用`nsenter`查看容器进程或网络配置。使用时注意目标进程状态,理解命名空间类型,并谨慎操作。
|
16天前
|
应用服务中间件 nginx
cmd 杀掉 nginx后台进程 命令杀掉nginx后台 nginx 常用命令
cmd 杀掉 nginx后台进程 命令杀掉nginx后台 nginx 常用命令
17 0
|
21天前
|
前端开发 应用服务中间件 Linux
Nginx15-16服务器启停命令
Nginx15-16服务器启停命令
|
21天前
|
应用服务中间件 Linux 开发工具
Nginx14---目录结构分析,查看Ngnix访问日志命令的写法​
Nginx14---目录结构分析,查看Ngnix访问日志命令的写法​
|
1月前
|
Shell Docker 容器
深入探索Docker容器管理:常用命令一览(1)
深入探索Docker容器管理:常用命令一览(1)
|
1月前
|
应用服务中间件 程序员 Linux
老程序员分享:Nginx常用命令
老程序员分享:Nginx常用命令
12 0
|
1月前
|
关系型数据库 应用服务中间件 nginx
docker基础,docker安装mysql,docker安装Nginx,docker安装mq,docker基础命令
docker基础,docker安装mysql,docker安装Nginx,docker安装mq,docker基础命令