Helm include vs template — What’s the Difference and When to Use Each
Helm provides two commonly used functions for rendering reusable templates: template and include.
At first glance, they seem similar — both insert one template inside another — but there’s a subtle and important difference.
Let’s break it down simply and clearly.
🔍 Key Difference
| Fucnction | Return | Difference |
|---|---|---|
template | Nothing (Renders the template directly into the output.) | For direct insert of tempaltes |
include | String | more flexible — can modify output |
📘 Example 1 template
template function just inserts content of teplate in current output.
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "myapp.fullname" . }}
spec:
template:
spec:
containers:
- name: myapp
image: nginx
{{- template "myapp.env" . }}
example of myapp.env:
# templates/_env.tpl
{{- define "myapp.env" -}}
env:
- name: ENV
value: "production"
{{- end }}
Result — content of env inserts directly.
Example 2: include
include rerturns string, which can be modified with indent, nindent or similar.
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "myapp.fullname" . }}
spec:
template:
spec:
containers:
- name: myapp
image: nginx
{{ include "myapp.env" . | nindent 10 }}
It is useful, when you need to control indentations or build strings:
annotations:
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
When to use
| Scenario | What to chose |
|---|---|
| Insert a template directly | template |
Use the result as a string (eg indent, printf, sha256sum и т.д.) | include |
| Use templates in annotations, labels, or values | include |
| Generate complete YAML resources | template |
Conclusion
template— inserts the rendered template output directly into the manifest.include— returns it as a string, allowing for transformation and reuse.
In most real-world cases, DevOps engineers prefer include because it’s more flexible and compatible with other Helm functions
💡 Advice: always add
| nindent N, to save correct indentations when usinginclude.