TL; 博士
完整版本
我正在为接受的应用程序编写部署规范
它在启动时从环境变量配置。某些
环境变量是从其他变量派生出来的。如果我设置
它们作为要在应用程序启动时获取的文件,我只想
做:
[me@myserver ~]$ cat ./myenv.sh
export FOO=foo
export BAR=bar
export FOOBAR=$FOO$BAR
[me@myserver ~]$ . ./myenv.sh
[me@myserver ~]$ printenv FOOBAR
foobar
但是,通过引用在 ConfigMap 中执行此操作的类似方法先前定义的键值对不起作用(请参阅示例 ConfigMap
和 Pod,如下)。结果如下:
[me@myserver ~]$ kubectl create -f my-app-config.yaml -f my-app-pod.yaml
configmap "my-app" created
pod "my-app" created
[me@myserver ~]$ kubectl exec -it my-app -- printenv | grep MY_CONFIGMAP
MY_CONFIGMAP_FOO=foo
MY_CONFIGMAP_FOOBAR=$(MY_CONFIGMAP_FOO)$(MY_CONFIGMAP_BAR)
MY_CONFIGMAP_BAR=bar
MY_CONFIGMAP_FOOBAR
的期望值是 foobar
。我试图交叉应用以下说明
Use ConfigMap-defined environment variables in Pod commands
从文档:
但是,这显然不起作用,我一直无法找到
在我的研究中回答。
我怀疑我已经知道答案了,但是有没有办法完成
这?
MCVE
配置映射
apiVersion: v1
kind: ConfigMap
metadata:
name: my-app
data:
MY_CONFIGMAP_FOO: foo
MY_CONFIGMAP_BAR: bar
# Desired concatenation would be `foobar`
MY_CONFIGMAP_FOOBAR: $(MY_CONFIGMAP_FOO)$(MY_CONFIGMAP_BAR)
荚apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: my-app
image: alpine
imagePullPolicy: IfNotPresent
envFrom:
- configMapRef:
name: my-app
command:
- /bin/sh
args:
- -c
- "while true; do sleep 3600; done"
尾声:二十九个月后在与 Kubernetes 合作两年半之后,我的最终解决方案(和建议)是使用 Helm 图表,最好使用 Ansible 管理的部署。
最佳答案
您可以借助此工具实现预期结果: envsubst 。
按照以下方式创建 ConfigMap
,
envsubst < my-app-config.yaml | kubectl apply -f -
现在,
ConfigMap
上的所有环境变量都将替换为已解析的值。关于docker - Kubernetes:引用先前定义的 ConfigMap 键值对,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53228090/