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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 我自认为这篇生产实践是对大前端、 容器化、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;" 以前台形式持续运行。



相关文章
|
3天前
|
Linux 开发者 Docker
如何构建在 Docker 容器中运行命令?
【1月更文挑战第6天】
64 0
|
3天前
|
运维 监控 Linux
【专栏】Docker命令`docker ps`的使用,包括列出运行中的容器、筛选特定容器、组合使用与其他命令配合以及在故障排查中的应用
【4月更文挑战第28天】本文介绍了Docker命令`docker ps`的使用,包括列出运行中的容器、筛选特定容器、组合使用与其他命令配合以及在故障排查中的应用。通过基础和高级用法示例,如列出所有容器、搜索特定镜像、监控资源使用等,帮助读者理解和提升容器管理效率。对于Linux运维工程师,掌握`docker ps`是必备技能。
|
3天前
|
存储 Ubuntu 安全
Docker容器常用命令
Docker容器常用命令
25 1
|
3天前
|
Linux Docker 容器
docker 容器常用命令
docker 容器常用命令
17 0
|
3天前
|
开发工具 Docker 索引
docker容器中没有vi编辑命令,简单的处理方法
docker容器中没有vi编辑命令,简单的处理方法
44 0
|
3天前
|
网络协议 应用服务中间件 Linux
centos7 Nginx Log日志统计分析 常用命令
centos7 Nginx Log日志统计分析 常用命令
152 2
|
3天前
|
监控 数据可视化 虚拟化
Docker容器常用命令笔记分享
Docker容器常用命令笔记分享
57 2
|
3天前
|
Kubernetes Shell Docker
容器服务ACK常见问题之容器服务ACK kubectl命令写到shell脚本失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
3天前
|
Shell Docker 容器
Docker的常用命令:加速你的容器化开发与部署
Docker的常用命令:加速你的容器化开发与部署
58 0
|
3天前
|
应用服务中间件 Linux nginx
web后端-linux-nginx-1.18操作命令和部署
web后端-linux-nginx-1.18操作命令和部署