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: webplay
  namespace: web-service
spec:
  template:
    metadata:
      labels:
        app: webplay
    spec:
      containers:
        - image: xxx/webplay:1.0.1
          imagePullPolicy: Always
          name: webplay
          command:
            - npm
            - start
          env:
            - name: TZ
              value: Asia/Shanghai
            - name: ALERT_LOG_LEVEL
              value: "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: webplay
  template:
    metadata:
      labels:
        app: webplay
    spec:
      containers:
        - command:
            - npm
            - start
          env:
            - name: TZ
              value: Asia/Shanghai
          image: >-
            xxx/webplay:1.0.1
          imagePullPolicy: Always
          name: webplay
          
          volumeMounts:
            - mountPath: /etc/localtime
              name: volume-localtime
            - mountPath: /opt/config
              name: configmap-volume
      volumes:
        - hostPath:
            path: /etc/localtime
            type: ''
          name: volume-localtime
        - configMap:
            defaultMode: 420
            items:
              - key: config.prod.js
                path: config.prod.js
            name: webplay-conf
          name: configmap-volume

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

在这里插入图片描述

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

# 修改前
          volumeMounts:
            - mountPath: /opt/config
              name: configmap-volume
# 修改后
          volumeMounts:
            - mountPath: /opt/config/config.prod.js
              name: configmap-volume
              subPath: config.prod.js

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

在这里插入图片描述

四、总结

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

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

相关推荐

  1. 前端不同年限差异不同开发经验差异

    2024-04-07 23:56:01       26 阅读
  2. 不同开源协议之间差异分析

    2024-04-07 23:56:01       48 阅读
  3. Docker无网环境配置方法

    2024-04-07 23:56:01       23 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-07 23:56:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-07 23:56:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-07 23:56:01       82 阅读
  4. Python语言-面向对象

    2024-04-07 23:56:01       91 阅读

热门阅读

  1. python - Django创建项目

    2024-04-07 23:56:01       37 阅读
  2. 【云开发笔记NO.23】初步了解CODING-TSF-TKE

    2024-04-07 23:56:01       37 阅读
  3. git提交代码github

    2024-04-07 23:56:01       39 阅读
  4. [RK3566-Android11] 关于2K (2560x1440)分辨率支持问题

    2024-04-07 23:56:01       35 阅读
  5. PHP获取亚马逊商品详情api接口

    2024-04-07 23:56:01       40 阅读
  6. 一名顶尖的黑客高手要学些什么?

    2024-04-07 23:56:01       36 阅读
  7. OMP实现压缩感知的实现(MATLAB)

    2024-04-07 23:56:01       41 阅读
  8. git log

    2024-04-07 23:56:01       37 阅读
  9. C语言中的预处理详解

    2024-04-07 23:56:01       40 阅读
  10. 探索自然语言处理:简单而完整的学习路线指南

    2024-04-07 23:56:01       30 阅读
  11. nginx + keepalived 搭建教程

    2024-04-07 23:56:01       33 阅读