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

相关推荐
孔令飞6 小时前
知己知彼,百战不殆:AI SKILL 实现原理剖析
云原生·go·ai编程
姜鱼问生8 小时前
网页一片白?Docker 跑 Nginx 读不到文件,403 Forbidden 排查实录
nginx·docker·容器
\光辉岁月/9 小时前
2.spring5-IOC
java·容器·ioc·注解
分布式存储与RustFS9 小时前
把 LSM 引擎直接架在对象存储上:slatedb 能不能跑在 RustFS 上?
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
java_logo9 小时前
Docker 部署 Excalidraw:轻松搭建手绘风格白板
运维·docker·容器·excalidraw·白板·轩辕镜像
时间售卖铺12 小时前
MySQL 日志管理
运维·数据库·mysql·云原生
老郭a12 小时前
流量一涨 Pod 扩不出来?K8s HPA 弹性伸缩配置避坑指南
云原生
程序员清风13 小时前
LibreChat 实战:用 Docker 搭建可扩展的多模型对话平台
运维·docker·容器
Web3&Basketball13 小时前
从0到1落地AI Agent沙箱隔离Docker实战:踩坑全记录
运维·docker·容器·agent·容器安全·沙箱隔离
xianyuCcCcCCCcc14 小时前
Kubernetes Service 与网络代理
网络·云原生·kubernetes