vue项目使用k8s动态配置环境变量(运行时)

公司需要同一套代码部署两个系统,实现一个镜像同时发布两个项目,大佬们拍板决定在k8s配置env在运行时动态读取环境变量
以下为gdp调研并结合项目代码,整合而得的实现步骤,已经发版部署,目前没有发现问题,项目成功在运行时读取环境变量

dockerfile文件

复制代码
FROM nginx:stable

# 复制 Vue 构建后的静态文件
COPY dist /usr/share/nginx/html

# 复制 Nginx 配置文件
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d/default.conf

# 使用 ENTRYPOINT 让容器启动时动态生成 config.js。需要放置在一个文件夹中,不能直接放到根目录/usr/share/nginx/html/config.js,会无法访问(奇怪的bug)
ENTRYPOINT ["/bin/sh", "-c", "echo \"window._env_ = { VUE_APP_BASE_API: '$VUE_APP_BASE_API' };\" > /usr/share/nginx/html/js/config.js && exec nginx -g 'daemon off;'"]

EXPOSE 80

nginx.conf

修改 nginx.conf,确保 config.js 不被缓存

如果不写:config.js 可能会被缓存,导致环境变量更新后,前端仍然使用旧的 API 地址

复制代码
    location /js/config.js {
        root /usr/share/nginx/html;
        add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate";
        expires 0;
    }

public/index.html

根目录引入config.js。不能直接用 /config.js 或者 ./config.js,因为运行后无法使用根目录访问 (奇怪的事情)

必须在挂载app前引入

html 复制代码
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <meta name="renderer" content="webkit" />
    <meta http-equiv="Pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache, no-store, must-revalidate">
    <meta http-equiv="expires" content="0">
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
    />
    <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
    <script src="/js/config.js"></script>

utils/ request.js

window.env?.VUE_APP_BASE_API 让 Vue 从 config.js 读取 API 地址,这个文件会在 K8s 运行时生成。(dockerfile文件设置

不要用 process.env.VUE_APP_BASE_API,因为 Vue process.env 只在 build 时生效,而不是 run 时!

javascript 复制代码
const service = axios.create({
  // baseURL: process.env.VUE_APP_BASE_API,
  baseURL: window._env_?.VUE_APP_BASE_API || process.env.VUE_APP_BASE_API,
  timeout: 180000,
});

k8s修改yaml,配置环境变量

javascript 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: vue-app
spec:
  replicas: 1
  template:
    spec:
      containers:
        - name: vue-app
          image: my-vue-app:latest
          env:
            - name: VUE_APP_BASE_API
              value: "http://www.baidu.com:82"

容器检查

进入容器检查k8s是否传入环境变量。例如我的环境变量设置的是:http://www.baidu.com:82

bash 复制代码
echo $VUE_APP_BASE_API
#正确传入显示
http://www.baidu.com:82

如果是空的,说明 Kubernetes 没有正确传入环境变量
dockerfile文件设置动态生成的config.js文件目录为 /usr/share/nginx/html/js/config.js

检查运行的项目中是否存在 /usr/share/nginx/html/js文件

bash 复制代码
#进入/usr/share/nginx/html/js文件
cd /usr/share/nginx/html/js

#进入后列出指定目录下的文件和目录名称:ls
#显示js文件夹中有以下10个js文件
/usr/share/nginx/html/js# ls
chunk.0.1742461339950.js  chunk.2.1742461339950.js  chunk.4.1742461339950.js  chunk.6.1742461339950.js              config.js
chunk.1.1742461339950.js  chunk.3.1742461339950.js  chunk.5.1742461339950.js  chunk.chunk-vendors.1742461339950.js  jsapp.1742461339950.js

#查看config.js
cat /usr/share/nginx/html/js/config.js
window._env_ = { VUE_APP_BASE_API: 'http://www.baidu.com:82' };

成功后将项目中所有 process.env.VUE_APP_BASE_API 改为 window.env?.VUE_APP_BASE_AP

相关推荐
may_一一2 小时前
Docker宿主机IP获取
tcp/ip·docker·容器
加勒比海涛2 小时前
微服务架构实战:从服务拆分到RestTemplate远程调用
微服务·云原生·架构
alden_ygq3 小时前
Kubernetes生产实战(十四):Secret高级使用模式与安全实践指南
java·安全·kubernetes
掘金-我是哪吒5 小时前
分布式微服务系统架构第128集:elastic-search安装部署
分布式·微服务·云原生·架构·系统架构
小马爱打代码10 小时前
K8S - 蓝绿发布实战 - Argo Rollouts 零停机方案解析
云原生·容器·kubernetes
檀越剑指大厂12 小时前
【Docker系列】docker inspect查看容器部署位置
运维·docker·容器
A尘埃14 小时前
K8S有状态服务部署(MySQL、Redis、ES、RabbitMQ、Nacos、ZipKin、Sentinel)
redis·mysql·kubernetes
sg_knight15 小时前
Docker镜像搬运工:save与load命令的实战指南
docker·容器·备份与恢复·docker save·docker image备份
明仔丶17 小时前
开启docker中mysql的binlog日志
运维·docker·容器·binlog
维运17 小时前
【kubernetes】通过Sealos 命令行工具一键部署k8s集群
云原生·容器·kubernetes