如何使用 .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 也应该基于现有文件(下面是 kustomizekubectl --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