nodejs应用程序不同部署环境下的差异配置方案

一、背景

nodejs应用程序,不同于java语言使用分布式配置,当部署于不同的环境里,因为环境的差异,配置项的值也不尽相同。
最常见的差异就是数据库的连接信息,而代码是一份,不能把生产环境的信息暴露在非生产环境。
所以,我们需要把差异值写在不同的配置文件里,比如我们本文要说的项目,它就有以下配置文件。

-rw-r--r-- 1 root root 2474 Nov  1  2022 config.default.js
-rw-r--r-- 1 root root  872 Jan 14  2019 config.local.js
-rw-r--r-- 1 root root  245 Aug 30  2022 config.prod.js
-rw-r--r-- 1 root root   72 Jan 14  2019 config.test.js

这是通过js配置文件的方式。

还有一类配置,通过环境变量的方式。比如很多语言的配置文件都是.env文件。

二、配置环境变量

这种方式比较常见,也比较简单。

docker run -it --name=webplay -p 5175:5174 -e "ALERT_LOG_LEVEL=info" -v /home/xxx/Documents/code/webPlayer/log:/root/logs xxx/webplay:1.0.0

这里的-e “ALERT_LOG_LEVEL=info”,把变量变量ALERT_LOG_LEVEL赋值为info。

如果是k8s,deployment.yaml文件,见下:

apiVersion: apps/v1
kind: Deployment
metadata:name: webplaynamespace: web-service
spec:template:metadata:labels:app: webplayspec:containers:- image: xxx/webplay:1.0.1imagePullPolicy: Alwaysname: webplaycommand:- npm- startenv:- name: TZvalue: Asia/Shanghai- name: ALERT_LOG_LEVELvalue: "info"# 后文略

三、ConfigMap持久化配置文件

接着上文所说,config.prod.js是生产环境的配置文件,其数据库连接地址是生产环境的,不能被暴露于开发环境。所以在构建docker image镜像的时候,该文件是不存在的,或者空的。

所以我们必须把config.prod.js的赋值放在生产,这就是代码和配置分离的原则。

怎么放呢?

这里采用了configMap,如果是docker或者docker-compose,使用-v映射即可。

1、新建configMap

apiVersion: v1
kind: ConfigMap
metadata:name: webplay-conf
data:config.prod.js: |/*** 生产环境配置** 最终生效的配置为 prod + default(前者覆盖后者)*/module.exports = app => {const exports = {};exports.mongoose = {client: {url: 'mongodb://{用户名}:{密码}@{host}:3717/webplay',options: {},},};exports.static = {maxAge: 0 // maxAge 缓存,默认 1};return exports;};

在这里插入图片描述
在这里插入图片描述

2、k8s deployment.yaml

添加一个卷(volume)来引用ConfigMap,并在容器的卷挂载(volume mount)部分指定挂载路径。

spec:selector:matchLabels:app: webplaytemplate:metadata:labels:app: webplayspec:containers:- command:- npm- startenv:- name: TZvalue: Asia/Shanghaiimage: >-xxx/webplay:1.0.1imagePullPolicy: Alwaysname: webplayvolumeMounts:- mountPath: /etc/localtimename: volume-localtime- mountPath: /opt/configname: configmap-volumevolumes:- hostPath:path: /etc/localtimetype: ''name: volume-localtime- configMap:defaultMode: 420items:- key: config.prod.jspath: config.prod.jsname: webplay-confname: configmap-volume

3、进入容器查看config.prod.js

在这里插入图片描述

如果你想只对config.prod.js进行差异配置,关于volume修改如下:

# 修改前volumeMounts:- mountPath: /opt/configname: configmap-volume
# 修改后volumeMounts:- mountPath: /opt/config/config.prod.jsname: configmap-volumesubPath: config.prod.js

对比修改前,/opt/config目录下的挂载有差异。修改前,config目录下只有configmap配置了的才挂载;而修改后,按需挂载文件,只有config.prod.js挂载,其他保持容器里的配置不变。

在这里插入图片描述

四、总结

因为涉及环境的差异,如何部署的时候指定不同的配置,是有状态部署必然需要解决的问题。

这里使用了环境变量和configmap两种方式,当然还可以使用分布式配置的方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/300506.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day02 51单片机

51单片机学习 1闪烁LED 1.1 需求描述 这个案例,我们要让P00引脚对应的LED按照1秒闪烁1次。 1.2 硬件设计 1.1 软件设计 1)LED闪烁的代码 想让LED闪烁,就需要P00的值不断在0和1之间循环变化。实现这一功能的代码也很简单: #include <STC89C5xRC.H> //包含STC89…

xss【2】

1.xss钓鱼 钓鱼攻击利用页面&#xff0c;fish.php黑客钓鱼获取到账号密码存储的位置 xss进行键盘记录 2.xss常规防范 3.xss验证payload XSS&#xff08;跨站攻击&#xff09;_details/open/ontoggle-CSDN博客

数据结构(3)----栈和队列

目录 一.栈 1.栈的基本概念 2.栈的基本操作 3.顺序栈的实现 •顺序栈的定义 •顺序栈的初始化 •进栈操作 •出栈操作 •读栈顶元素操作 •若使用另一种方式: 4.链栈的实现 •链栈的进栈操作 •链栈的出栈操作 •读栈顶元素 二.队列 1.队列的基本概念 2.队列的基…

Annaconda的替代品miniforge!

用了多年的Annaconda竟然要收费了&#xff08;个人不收费&#xff0c;企业收费&#xff0c;但个人电脑在企业IP下&#xff0c;还是被警告了&#xff09;&#xff0c;只能用miniforge 全面替换了&#xff01; 一、卸载anaconda windows下卸载&#xff0c; 设置 -> 应用和功…

【算法】动态规划练习(一)

目录 1137. 第 N 个泰波那契数 分析 代码 面试题 08.01. 三步问题 分析 代码 746. 使用最小花费爬楼梯 分析 代码 泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2 给你整数 n&#xff0c;请返回第 n 个泰波…

C++进阶篇11---IO流

一、对C语言的输入输出的理解 C语言中我们经常用scanf()和printf()进行输入输出&#xff0c;形象的描述它们的作用如下 对于缓冲区的理解&#xff1a; 可以屏蔽掉低级I/O的实现&#xff0c;低级I/O的实现依赖操作系统本身内核的实现&#xff0c;所以如果能够屏蔽这部分的差异…

基于PHP的校园招聘管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的校园招聘管理系统 一 介绍 此校园招聘管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为个人用户&#xff0c;企业和管理员三种。 技术栈&#xff1a;phpmysqlbootstrapphpstudyvscode 二…

蓝桥杯第十四届C++C组

目录 三国游戏 填充 翻转 【单调队列优化DP】子矩阵 【快速幂、欧拉函数】互质数的个数 【tire树】异或和之差 【质因数分解】公因数匹配 子树的大小 三国游戏 题目描述 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都…

C语言整数和小数的存储

1.整数在内存中的存储 计算机使用二进制进行存储、运算&#xff0c;整数在内存中存储使用的是二进制补码 1.1原码、反码、补码 整数的2进制表⽰⽅法有三种&#xff0c;即 原码、反码和补码 三种表⽰⽅法均有符号位和数值位两部分&#xff0c;符号位都是⽤0表⽰“正”&am…

Qt实现无边框圆角窗口

我们在使用QDialog的时候许多场景下都不需要默认的标题栏&#xff0c;这时候我们需要设置他的标志位。 this->setWindowFlags(Qt::FramelessWindowHint);由于现代的窗口风格&#xff0c;我们一般会设置窗口为圆角边框的样式&#xff0c;我们可以使用qss的方式来进行设置。 …

汇编——SSE打包整数

SSE也可以进行整数向量的加法&#xff0c;示例如下&#xff1a; ;sse_integer.asm extern printfsection .datadummy db 13 align 16pdivector1 dd 1dd 2dd 3dd 4pdivector2 dd 5dd 6dd 7dd 8fmt1 db "Packed Integer Vector 1: %d, %d, %d, %d",…

提升团队工程交付能力,从“看见”工程活动和研发模式开始

作者&#xff1a;张裕、雅纯 理想中的研发团队应当具有以下特征&#xff1a; 总是工作在最高优先级的事项上 理想的研发团队能够识别并始终集中精力在当前最紧迫和最有价值的任务上。这需要团队具备出色的项目管理能力和决策能力&#xff0c;以便能够正确评估优先级&#xff0…

Ant Design Vue

Ant Design Vue是一个由阿里巴巴团队打造的Vue组件库&#xff0c;它以其优雅的设计和丰富的功能集成而被广泛使用。以下是对Ant Design Vue的简单介绍&#xff1a; 首先&#xff0c;Ant Design Vue采用了精良的设计风格&#xff0c;为用户提供了简约、美观的界面&#xff0c;符…

MySQL-视图:视图概述、创建、查看、更新、修改、删除

第14章 视图 1. 常见的数据库对象2. 视图概述2.1 为什么使用视图&#xff1f;2.2 视图的理解 3. 创建视图3.1 创建单表视图3.2 创建多表联合视图3.3 基于视图创建视图 4. 查看视图5. 更新视图的数据5.1 一般情况5.2 不可更新的视图 6. 修改、删除视图6.1 修改视图6.2 删除视图 …

微信小程序使用自己的布局

我第一天学习微信小程序&#xff0c;照着黑马程序员老师的操作模仿编辑。因为视频是23年的&#xff0c;我24年4月份学习发现很多地方不一样了。 新版微信开发者工具中没有自带wxss文件。我自己建了一个list.wxss文件&#xff0c;发现用不了&#xff0c;在list.wxml文件中编写v…

pbootcms模板网站饰品首饰玛瑙水晶钻石饰品玉石戒指复古珠宝饰品pbcms网站源码下载

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 pbootcms模板网站饰品首饰玛瑙水晶钻石饰品玉石戒指复古珠宝饰品pbcms网站源码下载PC版 pbootcms内核开发的网站模板&#xff0c;该模版适用于饰品首饰类企业网站&#xff0c;复古珠…

spring面试八股

常用的注册bean的方式 ComponentScan扫描到的service和Controller等的注解 Configration配置类或者是xml文件的定义。 spring中有几种依赖注入的方式 1.构造器注入。 2.setter方法注入。 3.使用field属性的方式注入。 applicationContext是什么 spring bean spring aop Aop…

iOS 应用内网络请求设置代理

主要通过URLSessionConfiguration 的connectionProxyDictionary 属性 为了方便其他同学使用&#xff0c;我们可以通过界面来进行设定&#xff08;是否开启代理、服务端、端口&#xff09;&#xff0c;从而达到类似系统上的设定 具体链接参考&#xff1a;为 iOS 网络请求设置代理…

【电子取证篇】USB软只读锁软件

【电子取证篇】USB软只读软件 推荐的这两款USB只读软件都免安装版本&#xff0c;方便携带—【蘇小沐】 1、实验环境 Removable Access Tool_v1.2usbblock_v1.0Windows 11 专业工作站版23H2&#xff08;22631.3374&#xff09; &#xff08;一&#xff09;Removable Access …

Spring——框架介绍

每一个Java技术中都会存在一个“核心对象”&#xff0c;这个核心对象来完成主要任务为了得到核心对象&#xff0c;需要创建若干个辅助对象&#xff0c;从而导致开发步骤增加JDBC中 JDBC 核心对象——PreparedStatement 通过DriverManager得到数据库厂商提供的Driver对象DriverM…