I've a NextJS app which needs a .env file mounted. I usually do this with providing a 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
But how to do this with Kustomize?
I try it with envs, but how do I get the values inside?
configMapGenerator:
- name: frontend-configmap
envs:
- .env
Thank you in advance
CodePudding user response:
You need to have .env file created first. And ideally even creating configmaps should be based on the existing file (below are examples for kustomize and kubectl --from-file).
Then there are two options how to create a configmap:
- create
.envfile with environment variables within (which is your example configmap) - create a configmap with environment variables from
.envfile (each variable is a separate key)
Test structure:
$ 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 file with envvars inside:
kustomization.yaml with an additional option :
$ 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 - disable appending a content hash suffix to the names of generated resources, see generator options.
And all left is to run it:
$ 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
The same result can be achieved by running using --from-file option:
$ 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 with envvars as keys within:
$ 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
Run it to see the output:
$ 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
Same with kubectl and --from-env-file option:
$ 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
More details:
Edit - use already existing configmap.yaml
If configmap already exists, then it's possible to reference to it from kustomization.yaml (as mentioned in comment, kustomize is a template engine and using it with this direct reference only without any transformations doesn't really make sense. Here is one of the examples of why you need to use kustomize).
$ tree
.
├── cm.yaml
└── kustomization.yaml
cm.yaml has exactly the same config from the question.
$ cat kustomization.yaml
resources:
- cm.yaml
namePrefix: test- # used namePrefix for demo purpose (you can omit it as well)
Building this and getting the same configmap with .env file inside:
$ 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
