Helm command reference for Kubernetes cluster deployments. The Helm manifest represents desired cluster state. Covers install, upgrade, delete, ACR auth, YAML conventions, Solr ingress 413 fix, and rollback for hung upgrades.
Commands below apply to Helm 3 and 4 unless noted. Helm 2 is deprecated.

Variables used in commands
CHART='path_to_chart'
DIRECTORY='directory_name'
NAME='release_name'
NAMESPACE='kubernetes_namespace'
REPO_NAME='helm_repo_name' # e.g. rancher-latest, acrteam.azurecr.io
REPO_URL='repo_url' # e.g. https://releases.rancher.com/server-charts/latest
REGISTRY='oci_registry' # e.g. acrteam.azurecr.io/helm
VALUES='path_to_values_yaml_file'
Common flags
--debug show verbose output
--dry-run simulate without applying
-n / --namespace target namespace
-f / --values path to values YAML file
--create-namespace create namespace if it doesn't exist
--wait wait for resources to be ready before returning
--atomic auto-rollback on failure (implies --wait)
-o / --output output format: table, json, yaml
Create a chart
helm create $NAME scaffold a new chart in a directory named $NAME
Install, upgrade, uninstall
helm install -f $VALUES $NAME $CHART install with values
helm install -f $VALUES $NAME $CHART --dry-run --debug dry-run with debug
helm install -f $VALUES $NAME $CHART -n $NAMESPACE --create-namespace install into a namespace
helm install -f $VALUES $NAME $REPO_NAME/$CHART install from a repo
helm install -f $VALUES $CHART --generate-name let Helm generate the release name
helm install $NAME $CHART --set ingress.hosts[0].host=$HOST --set ingress.hosts[0].paths[0]=/ install with inline value overrides
helm upgrade -f $VALUES $NAME $CHART upgrade an existing release
helm upgrade -f $VALUES $NAME $CHART --install upgrade, or install if not present
helm upgrade -f $VALUES $NAME $CHART --install --wait --atomic upgrade with wait and auto-rollback
helm upgrade -f $VALUES $NAME $CHART --dry-run --debug --install dry-run with install-if-missing
helm upgrade -f $VALUES $NAME $CHART --set image.tag=$TAG upgrade with inline override
helm upgrade -f $VALUES $(helm ls | grep $NAME | awk '{print $1}') $CHART upgrade by looking up the release name dynamically:
helm uninstall $NAME remove a release
helm uninstall $NAME -n $NAMESPACE remove from a specific namespace
helm uninstall $(helm ls | grep $NAME | awk '{print $1}') remove by dynamic lookup
List releases
helm list list releases in current namespace
helm list -A list across all namespaces
helm list | grep $NAME filter by name
Search for charts
helm search repo $KEYWORD search configured repos
helm search hub $KEYWORD search Artifact Hub
Pull and package
helm pull $CHART download chart archive
helm pull $CHART --untar --untardir $DIRECTORY download and extract to directory
helm pull $REPO_NAME/$CHART --version 1.2.3 pull a specific version
helm package $CHART package chart directory into .tgz
helm package $CHART --destination $DIRECTORY package to a specific directory
Show chart information
helm show all $CHART show all chart info
helm show chart $CHART show Chart.yaml definition
helm show values $CHART show default values
helm show crds $CHART show CRDs defined by the chart
helm show readme $CHART show the chart's README
Get release information
helm get values $NAME show values for a deployed release
helm get manifest $NAME show rendered Kubernetes manifests
helm get hooks $NAME show hooks for a release
helm get notes $NAME show installation notes
helm get all $NAME show all release info
Status and history
helm status $NAME show release status
helm history $NAME show release revision history
helm rollback $NAME 1 rollback to revision 1
helm test $NAME run tests defined in the chart
Hung upgrades
When an upgrade is stuck (pending-upgrade or failed state):
helm ls -a list all releases including failed/pending
helm history $NAME find the last good revision number
helm rollback $NAME <revision> rollback to the last known-good revision
Dependencies
helm dependency list $CHART list dependencies
helm dependency update $CHART update Chart.lock and download dependencies
helm dependency build $CHART rebuild dependencies from Chart.lock
Repositories
helm repo add $REPO_NAME $REPO_URL add a repo
helm repo add $REPO_NAME $REPO_URL --username USER --password PASS add with auth
helm repo list list configured repos
helm repo update update repo indexes
helm repo remove $REPO_NAME remove a repo
helm repo index $DIRECTORY generate index.yaml for a local repo
OCI registries (Helm 3.8+)
helm registry login $REGISTRY login to an OCI registry
helm registry logout $REGISTRY logout
helm push $CHART.tgz oci://$REGISTRY push chart to OCI registry
helm pull oci://$REGISTRY/$CHART --version 1.2.3 pull from OCI registry
Azure Container Registry (ACR)
Add an ACR Helm repo using the Azure CLI:
az acr helm repo add --name <acr-name>.azurecr.io
ACR auth via Docker credentials
Reference: Azure Container Registry Helm repos
Add to ~/.bashrc:
export DOCKER_CONFIG="~/.docker"
export HELM_REGISTRY_CONFIG="${DOCKER_CONFIG}/config.json"
export HELM_EXPERIMENTAL_OCI=1 # enable OCI support (Helm < 3.12)
. ~/.bashrc
Login to the ACR creates ~/.docker/config.json with auth tokens.
Create the image pull secret:
kubectl create secret generic regcred \
--from-file=.dockerconfigjson=~/.docker/config.json \
--type=kubernetes.io/dockerconfigjson
Inspect the secret:
kubectl get secret regcred --output=yaml
Reference in a deployment:
spec:
template:
spec:
imagePullSecrets:
- name: regcred
Templates and linting
helm template $NAME $CHART -f $VALUES render templates locally without deploying
helm template $NAME $CHART -f $VALUES > output.yaml render to a file
helm template $NAME $CHART --set key=value render with inline override
helm lint $CHART validate chart for issues
helm lint $CHART --strict treat warnings as errors
helm lint output.yaml lint a rendered manifest file
Utilities
helm env show Helm environment variables and paths
helm version show Helm version
helm completion bash generate shell autocompletion (also: zsh, fish, powershell)
Ingress — 413 Request Entity Too Large
When an Nginx ingress proxy rejects large uploads (e.g., Solr batch imports), add these annotations to the Ingress resource:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: 500m
nginx.org/client-max-body-size: "0"
nginx.org/proxy-connect-timeout: 600s
nginx.org/proxy-read-timeout: 600s
proxy-body-size: 500m raises the upload limit. client-max-body-size: "0" disables the client-side limit. The timeout annotations prevent premature termination of long-running requests.
Conventions
- Indentation — follow the style displayed in Helm debug and ArgoCD outputs, not Microsoft dash indents
- Annotation order — order annotations alphabetically, matching Helm debug and ArgoCD
- YAML file names — follow kubectl resource names (e.g.,
ingress.yaml,deployment.yaml) - .helmignore — keep a single file in the chart root; remove from subfolders
- Templatize — share templates across identical YAML files rather than duplicating
- Single .tpl for Services — create and apply one
.tplfile for all Service resources - Dash position — use a consistent position for the dash in YAML
- Lowercase — use lowercase for all keys and values, not CAPS
References
- Helm website
- Helm commands
- Chart template guide
- Helm cheat sheet (phoenixNAP)
- Azure ACR Helm
- Azure ACR Helm repos
ArgoCD References
ArgoCD automatically fetches desired state from a Helm repo.
