如何使用 .env 和 Kustomize 创建 configMap
How to create configMap with .env with Kustomize
我有一个需要挂载 .env 文件的 NextJS 应用程序。我通常通过提供一个 configMap 来做到这一点:
kind: ConfigMap
apiVersion: v1
metadata:
name: frontend-configmap
namespace: default
data:
.env: |-
NEXT_PUBLIC_API_URL=http://my.domain.com
API_URL=http://my.domain.com
但是如何使用 Kustomize 做到这一点?
我用 envs
试了一下,但如何获取里面的值?
configMapGenerator:
- name: frontend-configmap
envs:
- .env
提前致谢
您需要先创建 .env
文件。理想情况下,即使创建 configmap 也应该基于现有文件(下面是 kustomize
和 kubectl --from-file
的示例)。
然后有两个选项如何创建 configmap:
- 创建
.env
文件,其中包含环境变量(这是您的示例配置映射)
- 使用来自
.env
文件的环境变量创建一个 configmap(每个变量都是一个单独的键)
测试结构:
$ tree -a
.
├── .env
└── kustomization.yaml
$ cat .env # same as your test data
NEXT_PUBLIC_API_URL=http://my.domain.com
API_URL=http://my.domain.com
configmap with .env
文件,里面有 envvars:
kustomization.yaml
附加选项:
$ cat kustomization.yaml
configMapGenerator:
- name: frontend-configmap
files: # using files here as we want to create a whole file
- .env
generatorOptions:
disableNameSuffixHash: true # use a static name
disableNameSuffixHash
- 禁用将内容哈希后缀附加到生成资源的名称,请参阅 generator options。
剩下的就是运行它:
$ kustomize build .
apiVersion: v1
data:
.env: | # you can see it's a file with context within
NEXT_PUBLIC_API_URL=http://my.domain.com
API_URL=http://my.domain.com
kind: ConfigMap
metadata:
name: frontend-configmap
使用 --from-file
选项 运行ning 可以获得相同的结果:
$ kubectl create cm test-configmap --from-file=.env --dry-run=client -o yaml
apiVersion: v1
data:
.env: |
NEXT_PUBLIC_API_URL=http://my.domain.com
API_URL=http://my.domain.com
kind: ConfigMap
metadata:
creationTimestamp: null
name: test-configmap
configmap 以 envvars 作为关键字:
$ cat kustomization.yaml
configMapGenerator:
- name: frontend-configmap
envs: # now using envs to create a configmap with envvars as keys inside
- .env
generatorOptions:
disableNameSuffixHash: true # use a static name
运行 看看输出结果:
$ kustomize build .
apiVersion: v1
data: # you can see there's no file and keys are created directly
API_URL: http://my.domain.com
NEXT_PUBLIC_API_URL: http://my.domain.com
kind: ConfigMap
metadata:
name: frontend-configmap
与 kubectl
和 --from-env-file
选项相同:
$ kubectl create cm test-configmap --from-env-file=.env --dry-run=client -o yaml
apiVersion: v1
data:
API_URL: http://my.domain.com
NEXT_PUBLIC_API_URL: http://my.domain.com
kind: ConfigMap
metadata:
creationTimestamp: null
name: test-configmap
更多详情:
编辑 - 使用已经存在的 configmap.yaml
如果 configmap
已经存在,则可以从 kustomization.yaml
引用它(如评论中所述,kustomize
是一个模板引擎并且仅将其与此直接引用一起使用没有任何转换并没有真正意义。Here 是您需要使用 kustomize
).
的示例之一
$ tree
.
├── cm.yaml
└── kustomization.yaml
cm.yaml
与问题中的配置完全相同。
$ cat kustomization.yaml
resources:
- cm.yaml
namePrefix: test- # used namePrefix for demo purpose (you can omit it as well)
构建此文件并获得相同的 configmap
,其中包含 .env
文件:
$ kustomize build .
apiVersion: v1
data:
.env: |-
NEXT_PUBLIC_API_URL=http://my.domain.com
API_URL=http://my.domain.com
kind: ConfigMap
metadata:
name: test-frontend-configmap # name with prefix as it was setup for demo
namespace: default
我有一个需要挂载 .env 文件的 NextJS 应用程序。我通常通过提供一个 configMap 来做到这一点:
kind: ConfigMap
apiVersion: v1
metadata:
name: frontend-configmap
namespace: default
data:
.env: |-
NEXT_PUBLIC_API_URL=http://my.domain.com
API_URL=http://my.domain.com
但是如何使用 Kustomize 做到这一点?
我用 envs
试了一下,但如何获取里面的值?
configMapGenerator:
- name: frontend-configmap
envs:
- .env
提前致谢
您需要先创建 .env
文件。理想情况下,即使创建 configmap 也应该基于现有文件(下面是 kustomize
和 kubectl --from-file
的示例)。
然后有两个选项如何创建 configmap:
- 创建
.env
文件,其中包含环境变量(这是您的示例配置映射) - 使用来自
.env
文件的环境变量创建一个 configmap(每个变量都是一个单独的键)
测试结构:
$ tree -a
.
├── .env
└── kustomization.yaml
$ cat .env # same as your test data
NEXT_PUBLIC_API_URL=http://my.domain.com
API_URL=http://my.domain.com
configmap with .env
文件,里面有 envvars:
kustomization.yaml
附加选项:
$ cat kustomization.yaml
configMapGenerator:
- name: frontend-configmap
files: # using files here as we want to create a whole file
- .env
generatorOptions:
disableNameSuffixHash: true # use a static name
disableNameSuffixHash
- 禁用将内容哈希后缀附加到生成资源的名称,请参阅 generator options。
剩下的就是运行它:
$ kustomize build .
apiVersion: v1
data:
.env: | # you can see it's a file with context within
NEXT_PUBLIC_API_URL=http://my.domain.com
API_URL=http://my.domain.com
kind: ConfigMap
metadata:
name: frontend-configmap
使用 --from-file
选项 运行ning 可以获得相同的结果:
$ kubectl create cm test-configmap --from-file=.env --dry-run=client -o yaml
apiVersion: v1
data:
.env: |
NEXT_PUBLIC_API_URL=http://my.domain.com
API_URL=http://my.domain.com
kind: ConfigMap
metadata:
creationTimestamp: null
name: test-configmap
configmap 以 envvars 作为关键字:
$ cat kustomization.yaml
configMapGenerator:
- name: frontend-configmap
envs: # now using envs to create a configmap with envvars as keys inside
- .env
generatorOptions:
disableNameSuffixHash: true # use a static name
运行 看看输出结果:
$ kustomize build .
apiVersion: v1
data: # you can see there's no file and keys are created directly
API_URL: http://my.domain.com
NEXT_PUBLIC_API_URL: http://my.domain.com
kind: ConfigMap
metadata:
name: frontend-configmap
与 kubectl
和 --from-env-file
选项相同:
$ kubectl create cm test-configmap --from-env-file=.env --dry-run=client -o yaml
apiVersion: v1
data:
API_URL: http://my.domain.com
NEXT_PUBLIC_API_URL: http://my.domain.com
kind: ConfigMap
metadata:
creationTimestamp: null
name: test-configmap
更多详情:
编辑 - 使用已经存在的 configmap.yaml
如果 configmap
已经存在,则可以从 kustomization.yaml
引用它(如评论中所述,kustomize
是一个模板引擎并且仅将其与此直接引用一起使用没有任何转换并没有真正意义。Here 是您需要使用 kustomize
).
$ tree
.
├── cm.yaml
└── kustomization.yaml
cm.yaml
与问题中的配置完全相同。
$ cat kustomization.yaml
resources:
- cm.yaml
namePrefix: test- # used namePrefix for demo purpose (you can omit it as well)
构建此文件并获得相同的 configmap
,其中包含 .env
文件:
$ kustomize build .
apiVersion: v1
data:
.env: |-
NEXT_PUBLIC_API_URL=http://my.domain.com
API_URL=http://my.domain.com
kind: ConfigMap
metadata:
name: test-frontend-configmap # name with prefix as it was setup for demo
namespace: default