values.yaml
The package’s default configuration, sitting beside hull.yaml at the package
root. Its contents are an arbitrary YAML map that your templates read via
${values.<path>}. Hull imposes no fixed schema — you define whatever shape
suits the application — but it does define how values merge and reserves one
key, tags, for layer selection.
Minimal example
name: my-app
replicaCount: 1
image:
repository: nginx
tag: latest
service:
port: 80
A template then references these as ${values.image.repository},
${values.service.port}, and so on. hull create generates this file.
Fields
values.yaml has no required keys and no fixed field set. Define keys freely to
match your templates. The table below covers only the keys hull itself gives
meaning to; every other key is passed through untouched.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
tags |
map of string→bool | no | {} |
Reserved. Each tags.<name> toggles the layers in hull.yaml that list <name> under their tags:. A truthy value enables those layers. |
| (any other key) | any | no | — | Application configuration. Read in templates via ${values.<path>} and usable in a layer’s condition (a dotted path such as cache.enabled). |
Merge order
At render time hull computes the effective values by deep-merging these sources, later winning (maps merge recursively; scalars and lists replace):
- Each enabled layer’s
values.yaml, in layer order. - This package’s
values.yaml. - The active profile’s values (
--profile, if any). - The selected environment’s
valueFilesthen inlinevalues(--env). -f / --values <file>arguments, in CLI order.--setarguments.--set-stringarguments (forces string typing).--set-filearguments (file contents become the value).--set-jsonarguments.
Set a key to null (YAML ~) to null it out from a lower-precedence source.
The effective values are validated against values.schema.json if that file
is present.
–set path syntax
--set, --set-string, --set-file, and --set-json share the same path
grammar:
| Path expression | Meaning |
|---|---|
replicaCount=3 |
Set a top-level key. |
image.tag=1.4.2 |
Set a nested key; intermediate maps are created. |
args[0]=--debug |
Set an array index; the array is created if absent. |
label\.io/name=api |
Backslash-escape a literal . inside a key. |
Use --set-string image.tag=2.0 when a numeric-looking value must stay a
string.
Full example
values.yaml:
# Application defaults. Templates read these as ${values.<path>}.
name: platform-api
replicaCount: 2
image:
repository: registry.example.com/platform-api
tag: "1.4.2"
service:
type: ClusterIP
port: 8080
resources:
requests:
cpu: 100m
memory: 128Mi
# Feature flag also usable as a layer `condition: cache.enabled`.
cache:
enabled: false
# Reserved: toggles hull.yaml layers that declare `tags: [observability]`.
tags:
observability: false
A templates/deployment.yaml reading these values:
apiVersion: apps/v1
kind: Deployment
metadata:
name: "${values.name}"
spec:
replicas: ${values.replicaCount}
template:
spec:
containers:
- name: app
image: "${values.image.repository}:${values.image.tag}"
Rendering with --set replicaCount=5 --set cache.enabled=true produces a
Deployment with replicas: 5 and, because cache.enabled is now truthy,
activates any layer whose condition is cache.enabled.
See also
- values.schema.json — validate the effective values.
hull template/hull install— render values into manifests.hull show values,hull get values— inspect defaults and effective values.- Values guide, Layers guide.