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.hqwc.cn/news/599060.html

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

相关文章

分布式主键ID生成策略

业务系统对分布式ID的要求 唯一性:在分布式系统中,每个节点都需要生成唯一的标识符来确保数据的唯一性。传统的单点生成ID方式无法满足分布式环境下的需求,而分布式ID能够在整个系统中保证每个节点生成的ID都是唯一的。 顺序性:某…

【TI毫米波雷达】官方工业雷达包的生命体征检测环境配置及避坑(Vital_Signs、IWR6843AOPEVM)

【TI毫米波雷达】官方工业雷达包的生命体征检测环境配置及避坑(Vital_Signs、IWR6843AOPEVM) 文章目录 生命体征基本介绍IWR6843AOPEVM的配置上位机配置文件避坑上位机start测试距离检测心跳检测呼吸频率检测空环境测试 附录:结构框架雷达基…

rocketMQ的主题

1.主题 2.队列 一个topic的queue中 的消息只能被一个消费者消费 3.分片 4.消息标识 5.生产者和消费者 工作流程

网络安全意识也是基础防御中的关键一环

在当今数字化时代,网络安全已经成为企业和个人生活中不可或缺的一部分。网络攻击的不断演进和加剧使得保护个人隐私、商业机密和国家安全变得尤为重要。然而,网络安全并非仅仅是技术层面的问题,更是一个综合性的挑战,需要广泛的参…

Linux【进程控制】总结

学习目标 首先进程控制分为四大部分:进程创建、进程退出、进程等待、进程替换; 第一步:学习如何来创建一个进程,一般我们会使用fork函数来创建子进程,创建子进程之后,就要去探索子进程与父进程的相关联系&a…

Visual Studio 2022-C语言如何防止头文件多次引入

头文件的包含 本地⽂件包含 #include "filename" 查找策略:先在源⽂件所在⽬录下查找,如果该头⽂件未找到,编译器就像查找库函数头⽂件⼀样在 标准位置查找头⽂件。 如果找不到就提⽰编译错误。 Linux环境的标准头⽂件的路径&…

书生·浦语训练营二期第三次笔记-茴香豆:搭建你的 RAG 智能助理

RAG学习文档1: https://paragshah.medium.com/unlock-the-power-of-your-knowledge-base-with-openai-gpt-apis-db9a1138cac4 RAG学习文档2: https://blog.demir.io/hands-on-with-rag-step-by-step-guide-to-integrating-retrieval-augmented-generation-in-llms-a…

yolov9直接调用zed相机实现三维测距(python)

yolov9直接调用zed相机实现三维测距(python) 1. 相关配置2. 相关代码2.1 相机设置2.2 测距模块2.2 实验结果 相关链接 此项目直接调用zed相机实现三维测距,无需标定,相关内容如下: 1. yolov4直接调用zed相机实现三维测…

90天玩转Python—05—基础知识篇:Python基础知识扫盲,使用方法与注意事项

90天玩转Python系列文章目录 90天玩转Python—01—基础知识篇:C站最全Python标准库总结 90天玩转Python--02--基础知识篇:初识Python与PyCharm 90天玩转Python—03—基础知识篇:Python和PyCharm(语言特点、学习方法、工具安装) 90天玩转Python—04—基础知识篇:Pytho…

C语言开发实战:使用EasyX在Visual Studio 2022中创建井字棋游戏

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

c++的学习之路:16、string(3)

上章有一些东西当时没学到,这里学到了将在补充,文章末附上代码,思维导图。 目录 一、赋值重载 二、带模板的创建 三、析构函数 四、代码 五、思维导图 一、赋值重载 这里的赋值重载就是直接利用交换函数进行把传参生成的临时数据和需要…

2024/4/7 IOday6

1&#xff1a;有一个隧道&#xff0c;全长5公里&#xff0c;有2列火车&#xff0c;全长200米&#xff0c; 火车A时速 100公里每小时 火车B时速 50公里每小时 现在要求模拟火车反复通过隧道的场景(不可能2列火车都在隧道内运行) #include <stdio.h> #include <string.…