使用 Init 容器定义环境变量值

特性状态: Kubernetes v1.34 [alpha](disabled by default)

本页展示如何通过文件为 Pod 中的容器配置环境变量。

准备开始

你必须拥有一个 Kubernetes 的集群,且必须配置 kubectl 命令行工具让其与你的集群通信。 建议运行本教程的集群至少有两个节点,且这两个节点不能作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面的 Kubernetes 练习环境之一:

你的 Kubernetes 服务器版本必须是 v1.34.

要获知版本信息,请输入 kubectl version.

设计原理

在本练习中,你将创建从文件中获取环境变量的 Pod,并将这些环境变量值投射到正在运行的容器中。

apiVersion: v1
kind: Pod
metadata:
  name: envfile-test-pod
spec:
  initContainers:
    - name: setup-envfile
      image:  nginx
      command: ['sh', '-c', 'echo "DB_ADDRESS=address\nREST_ENDPOINT=endpoint" > /data/config.env']
      volumeMounts:
        - name: config
          mountPath: /data
  containers:
    - name: use-envfile
      image: nginx
      command: [ "/bin/sh", "-c", "env" ]
      env:
        - name: DB_ADDRESS
          valueFrom:
            fileKeyRef:
              path: config.env
              volumeName: config
              key: DB_ADDRESS
              optional: false
  restartPolicy: Never
  volumes:
    - name: config
      emptyDir: {}

在上述清单中,你可以看到 initContainer 挂载一个 emptyDir 卷,并将环境变量写入到其中的某个文件, 而普通容器无需挂载卷,通过 fileKeyRef 字段引用此文件和环境变量键。 当 optional 字段设置为 false 时,fileKeyRef 中指定的 key 必须存在于环境变量文件中。

此卷只会挂载到写入文件的容器(initContainer)中,而使用环境变量的容器将不挂载此卷。

环境变量文件格式遵循 Kubernetes Env 文件标准

在容器初始化期间,kubelet 从 emptyDir 卷中指定的文件中获取环境变量,并将这些环境变量暴露给容器。

创建 Pod:

kubectl apply -f https://k8s.io/examples/pods/inject/envars-file-container.yaml

验证 Pod 中的容器是否在运行:

# 如果新 Pod 尚未就绪,多次运行此命令。
kubectl get pods

检查容器日志中的环境变量:

kubectl logs dapi-test-pod -c use-envfile | grep DB_ADDRESS

输出显示所选环境变量的值:

DB_ADDRESS=address

Env 文件语法

Kubernetes Env 文件格式源自 .env 文件。

在 Shell 环境中,.env 文件通常使用 source .env 命令加载。

对于 Kubernetes,定义的 Env 文件格式遵循更严格的语法规则:

  • 空行:空行会被忽略。

  • 行首空格:所有行的行首空格会被忽略。

  • 变量声明:变量必须声明为 VAR=VAL= 两侧的空格和行尾空格会被忽略。

    VAR=VAL → VAL
    
  • 注释:以 # 开头的行被视为注释并忽略。

    # 注释
    VAR=VAL → VAL
    
    VAR=VAL # 不是注释 → VAL # 不是注释
    
  • 换行续行:在变量声明行末使用反斜杠 (\) 表示值在下一行继续。行与行之间用单个空格连接。

    VAR=VAL \
    VAL2
    → VAL VAL2
    

接下来

最后修改 November 27, 2025 at 1:51 PM PST: [zh] Add define-environment-variable-via-file.md (08ebc1e945)