是否可以在容器内的 env 中将 application.properties 的内容公开为 key/value 对?
Is it possible to expose the contents of application.properties as key/value pairs in env inside the container?
我已经在配置目录中定义了应用程序属性文件。配置目录在下面的结构中。
config
application.properties
application-test.properties
application-dev.properties
application-prod.properties
我定义的configmap如下
{{ range $path, $bytes := .Files.Glob "config/*" }}
{{ base $path }}: '{{- $.Files.Get $path | nindent 2 | upper | replace "." "_" }}'
{{- end }}
我们使用 envFrom 属性 在 运行 容器中通过环境变量使用 ConfigMap。 (这在我的部署 yaml 文件中)
spec:
containers:
- envFrom:
- configMapRef:
name: nginx-configmap
Post运行helm install
,我看到生成了configmap。
kubectl describe cm sample-configmap
Data
====
----
SERVER_PORT = 8080 SERVER_NAME = LOCALHOST SERVER_GREETING = GREETING-SERVICE
----
在 configmap 中,内容不是生成为单个字符串,而是 key/value 对。
即使在容器内部,值也不会存储为 key/value 对。它们存储为字符串。
kubectl exec -it <pod> sh
/data # env | grep application.properties
application.properties= SERVER_PORT = 8080 SERVER_NAME = LOCALHOST SERVER_GREETING = GREETING-SERVICE SAMPLE_GROUPA_PARAM1 = VALUE1BASE SAMPLE_GROUPA_PARAM2 = VALUE2BASE SAMPLE_HIGHERPARAM = VALUEHIGHERBASE
/data # echo $application.properties
.properties
/data # echo $SERVER_PORT
我也试过了
data:
{{- (.Files.Glob "config/*").AsConfig | nindent 2 | upper | replace "." "_" }}
观察同样的问题。
是否可以在容器内的 env 中将 application.properties 的内容公开为 key/value 对?
问题在于您读取文件和 configmap 配置的方式。
假设 config 文件夹中的文件如下所示(请注意整数应包含在带引号的字符串中):
config.ini
SERVER_PORT = "8080"
SERVER_NAME = LOCALHOST
SERVER_GREETING = GREETING-SERVICE
SAMPLE_GROUPA_PARAM1 = VALUE1BASE
SAMPLE_GROUPA_PARAM2 = VALUE2BASE
SAMPLE_HIGHERPARAM = VALUEHIGHERBASE
configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
data:
{{ range $path, $bytes := .Files.Glob "config/*" }}
{{- $.Files.Get $path | indent 2 | upper | replace "." "_" | replace " = " ": " }}
{{- end }}
pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "env" ]
envFrom:
- configMapRef:
name: special-config
输出:
$ kubectl logs test-pod
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
SAMPLE_GROUPA_PARAM1=VALUE1BASE
SAMPLE_GROUPA_PARAM2=VALUE2BASE
HOSTNAME=test-pod
...
PWD=/
KUBERNETES_SERVICE_HOST=10.96.0.1
SERVER_GREETING=GREETING-SERVICE
SERVER_PORT=8080
SERVER_NAME=LOCALHOST
见Configure all key-value pairs in a ConfigMap as container environment variables
我已经在配置目录中定义了应用程序属性文件。配置目录在下面的结构中。
config
application.properties
application-test.properties
application-dev.properties
application-prod.properties
我定义的configmap如下
{{ range $path, $bytes := .Files.Glob "config/*" }}
{{ base $path }}: '{{- $.Files.Get $path | nindent 2 | upper | replace "." "_" }}'
{{- end }}
我们使用 envFrom 属性 在 运行 容器中通过环境变量使用 ConfigMap。 (这在我的部署 yaml 文件中)
spec:
containers:
- envFrom:
- configMapRef:
name: nginx-configmap
Post运行helm install
,我看到生成了configmap。
kubectl describe cm sample-configmap
Data
====
----
SERVER_PORT = 8080 SERVER_NAME = LOCALHOST SERVER_GREETING = GREETING-SERVICE
----
在 configmap 中,内容不是生成为单个字符串,而是 key/value 对。
即使在容器内部,值也不会存储为 key/value 对。它们存储为字符串。
kubectl exec -it <pod> sh
/data # env | grep application.properties
application.properties= SERVER_PORT = 8080 SERVER_NAME = LOCALHOST SERVER_GREETING = GREETING-SERVICE SAMPLE_GROUPA_PARAM1 = VALUE1BASE SAMPLE_GROUPA_PARAM2 = VALUE2BASE SAMPLE_HIGHERPARAM = VALUEHIGHERBASE
/data # echo $application.properties
.properties
/data # echo $SERVER_PORT
我也试过了
data:
{{- (.Files.Glob "config/*").AsConfig | nindent 2 | upper | replace "." "_" }}
观察同样的问题。
是否可以在容器内的 env 中将 application.properties 的内容公开为 key/value 对?
问题在于您读取文件和 configmap 配置的方式。 假设 config 文件夹中的文件如下所示(请注意整数应包含在带引号的字符串中):
config.ini
SERVER_PORT = "8080"
SERVER_NAME = LOCALHOST
SERVER_GREETING = GREETING-SERVICE
SAMPLE_GROUPA_PARAM1 = VALUE1BASE
SAMPLE_GROUPA_PARAM2 = VALUE2BASE
SAMPLE_HIGHERPARAM = VALUEHIGHERBASE
configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
data:
{{ range $path, $bytes := .Files.Glob "config/*" }}
{{- $.Files.Get $path | indent 2 | upper | replace "." "_" | replace " = " ": " }}
{{- end }}
pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "env" ]
envFrom:
- configMapRef:
name: special-config
输出:
$ kubectl logs test-pod
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
SAMPLE_GROUPA_PARAM1=VALUE1BASE
SAMPLE_GROUPA_PARAM2=VALUE2BASE
HOSTNAME=test-pod
...
PWD=/
KUBERNETES_SERVICE_HOST=10.96.0.1
SERVER_GREETING=GREETING-SERVICE
SERVER_PORT=8080
SERVER_NAME=LOCALHOST
见Configure all key-value pairs in a ConfigMap as container environment variables