Environment Variables (env and envFrom)
Overview
Three ways to set environment variables in containers:
- Static values -
envwithvalue - From ConfigMap/Secret -
envwithvalueFromorenvFrom - From Downward API -
envwithfieldReforresourceFieldRef
Static Values
yaml
containers:
- name: app
image: nginx
env:
- name: APP_ENV
value: "production"
- name: LOG_LEVEL
value: "info"
- name: PORT
value: "8080"Single Value from ConfigMap
yaml
env:
- name: DATABASE_HOST
valueFrom:
configMapKeyRef:
name: app-config
key: db_hostSingle Value from Secret
yaml
env:
- name: DATABASE_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: passwordAll Keys from ConfigMap (envFrom)
yaml
# ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DB_HOST: "postgres"
DB_PORT: "5432"
APP_ENV: "production"
---
# Pod
containers:
- name: app
image: nginx
envFrom:
- configMapRef:
name: app-config
# Creates env vars: DB_HOST, DB_PORT, APP_ENVAll Keys from Secret (envFrom)
yaml
containers:
- name: app
image: nginx
envFrom:
- secretRef:
name: db-credentials
# Creates env vars for each key in the secretAdd Prefix to envFrom
yaml
envFrom:
- configMapRef:
name: app-config
prefix: CONFIG_
# DB_HOST becomes CONFIG_DB_HOSTCombine Multiple Sources
yaml
containers:
- name: app
image: nginx
envFrom:
- configMapRef:
name: app-config
- secretRef:
name: app-secrets
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: EXTRA_VAR
value: "static-value"Order of Precedence
When same key exists in multiple sources:
env(explicit) wins overenvFrom- Later entries in
envFromarray override earlier ones
yaml
envFrom:
- configMapRef:
name: config1 # APP_ENV=staging
- configMapRef:
name: config2 # APP_ENV=production (wins)
env:
- name: APP_ENV
value: "development" # This wins over all envFromOptional References
Don't fail if ConfigMap/Secret missing:
yaml
env:
- name: OPTIONAL_VAR
valueFrom:
configMapKeyRef:
name: maybe-exists
key: some-key
optional: true
envFrom:
- configMapRef:
name: maybe-exists
optional: trueComplete Example
yaml
apiVersion: v1
kind: Pod
metadata:
name: env-demo
spec:
containers:
- name: app
image: busybox
command: ["sh", "-c", "printenv && sleep 3600"]
envFrom:
- configMapRef:
name: app-config
prefix: CFG_
- secretRef:
name: app-secrets
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
- name: STATIC_VAR
value: "hello"