You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx Deployment未从ConfigMap读取版本号问题求助

Kubernetes中Nginx无法渲染版本号的解决方法

问题根源:你把ConfigMap里的index.html直接挂载到Nginx静态目录,但Nginx本身不会自动替换静态HTML文件中的环境变量占位符,所以页面里的${VERSION}没有被替换成实际的版本值,导致显示空白。

解决方法1:启动容器时替换变量

修改Deployment配置,在Nginx启动前用envsubst工具替换index.html里的${VERSION}:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      app: my-nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: my-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        env:
        - name: VERSION
          valueFrom:
            configMapKeyRef:
              name: my-configmap
              key: version
        ports:
        - containerPort: 80
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
        # 新增启动命令:先替换变量再启动Nginx
        command: ["/bin/sh", "-c"]
        args: ["envsubst '${VERSION}' < /usr/share/nginx/html/index.html > /usr/share/nginx/html/index.tmp && mv /usr/share/nginx/html/index.tmp /usr/share/nginx/html/index.html && nginx -g 'daemon off;'"]
      volumes:
      - name: html
        configMap:
          name: my-configmap

原理:用envsubst把index.html中的${VERSION}替换为容器环境变量的值,先写到临时文件避免原文件被占用,替换完成后启动Nginx。

解决方法2:用Nginx内置模块替换响应内容

利用Nginx的ngx_http_sub_module模块,在返回页面时动态替换占位符:

  1. 先创建存放Nginx配置的ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  nginx.conf: |
    events {}
    http {
      server {
        listen 80;
        root /usr/share/nginx/html;
        index index.html;
        # 替换页面中的${VERSION}为环境变量值
        sub_filter '${VERSION}' '$VERSION';
        sub_filter_once off;
      }
    }
  1. 修改Deployment,挂载这个配置到Nginx的配置目录:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      app: my-nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: my-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        env:
        - name: VERSION
          valueFrom:
            configMapKeyRef:
              name: my-configmap
              key: version
        ports:
        - containerPort: 80
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
        - name: nginx-config
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
      volumes:
      - name: html
        configMap:
          name: my-configmap
      - name: nginx-config
        configMap:
          name: nginx-config

原理:Nginx收到请求返回页面时,自动把页面里的${VERSION}替换成容器的VERSION环境变量值,sub_filter_once off确保页面中所有匹配的占位符都被替换。

验证方法:部署修改后的配置后,执行kubectl exec <你的Nginx Pod名称> -- curl localhost:80,就能看到页面显示This is version 1.0 of my site.。

内容的提问来源于stack exchange,提问作者Chris G.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 05:37:51