Docker Registry Helm Chart

September 10, 2025 · View on GitHub

This directory contains a Kubernetes chart to deploy a private Docker Registry.

Prerequisites Details

  • PV support on underlying infrastructure (if persistence is required)

Chart Details

This chart will do the following:

  • Implement a Docker registry deployment

⚠️ Repo Migration and Deprecation Notice

The following change only affects attempts to install or update the chart via the https://helm.twun.io repo.

The https://helm.twun.io repo has been migrated to https://twuni.github.io/docker-registry.helm.

To update your configuration, remove and re-add the repo with the new URL:

helm repo remove twuni
helm repo add twuni https://twuni.github.io/docker-registry.helm

The deprecated repo URL, https://helm.twun.io, may become unavailable as early as October 16, 2025.

Installing the Chart

First, add the repo:

helm repo add twuni https://twuni.github.io/docker-registry.helm

To install the chart, use the following:

helm install twuni/docker-registry

Configuration

The following table lists the configurable parameters of the docker-registry chart and their default values.

ParameterDescriptionDefault
image.pullPolicyContainer pull policyIfNotPresent
image.repositoryContainer image to useregistry
image.tagContainer image tag to deploy2.8.1
imagePullSecretsSpecify image pull secretsnil (does not add image pull secrets to deployed pods)
persistence.accessModeAccess mode to use for PVCReadWriteOnce
persistence.enabledWhether to use a PVC for the Docker storagefalse
persistence.deleteEnabledEnable the deletion of image blobs and manifests by digestnil
persistence.sizeAmount of space to claim for PVC10Gi
persistence.storageClassStorage Class to use for PVC-
persistence.existingClaimName of an existing PVC to use for confignil
serviceAccount.createCreate ServiceAccountfalse
serviceAccount.nameServiceAccount namenil
serviceAccount.annotationsAnnotations to add to the ServiceAccount{}
deployment.annotationsAnnotations to add to the Deployment{}
service.portTCP port on which the service is exposed5000
service.typeservice typeClusterIP
service.clusterIPif service.type is ClusterIP and this is non-empty, sets the cluster IP of the servicenil
service.nodePortif service.type is NodePort and this is non-empty, sets the node port of the servicenil
service.loadBalancerIPif service.type is LoadBalancer and this is non-empty, sets the loadBalancerIP of the servicenil
service.loadBalancerSourceRangesif service.type is LoadBalancer and this is non-empty, sets the loadBalancerSourceRanges of the servicenil
service.sessionAffinityservice session affinitynil
service.sessionAffinityConfigservice session affinity confignil
replicaCountk8s replicas1
updateStrategyupdate strategy for deployment{}
podAnnotationsAnnotations for deployment pod, and garbageCollect pod unless set explicitly there. See garbageCollect{}
podLabelsLabels for deployment pod, and garbageCollect pod unless set explicitly there. See garbageCollect{}
podDisruptionBudgetPod disruption budget{}
resources.limits.cpuContainer requested CPUnil
resources.limits.memoryContainer requested memorynil
autoscaling.enabledEnable autoscaling using HorizontalPodAutoscalerfalse
autoscaling.minReplicasMinimal number of replicas1
autoscaling.maxReplicasMaximal number of replicas2
autoscaling.targetCPUUtilizationPercentageTarget average utilization of CPU on Pods60
autoscaling.targetMemoryUtilizationPercentage(Kubernetes ≥1.23) Target average utilization of Memory on Pods60
autoscaling.behavior(Kubernetes ≥1.23) Configurable scaling behavior{}
priorityClassName priorityClassName""
storageStorage system to usefilesystem
tlsSecretNameName of secret for TLS certsnil
secrets.htpasswdHtpasswd authenticationnil
secrets.s3.accessKeyAccess Key for S3 configurationnil
secrets.s3.secretKeySecret Key for S3 configurationnil
secrets.s3.secretRefThe ref for an external secret containing the s3AccessKey and s3SecretKey keys""
secrets.swift.usernameUsername for Swift configurationnil
secrets.swift.passwordPassword for Swift configurationnil
secrets.haSharedSecretShared secret for Registrynil
configDataConfiguration hash for dockernil
configPathConfiguration mount point in docker, /etc/docker/registry for registry version 2, /etc/distribution for version 3/etc/docker/registry
s3.regionS3 regionnil
s3.regionEndpointS3 region endpointnil
s3.bucketS3 bucket namenil
s3.rootdirectoryS3 prefix that is applied to allow you to segment datanil
s3.encryptStore images in encrypted formatnil
s3.secureUse HTTPSnil
s3.forcepathstyleUse path-style addressing, needed for some s3 compatible storage (minio)nil
s3.skipverifyAllows connection to s3 storage using TLS with untrusted/self-signed certificatenil
swift.authurlSwift authurlnil
swift.containerSwift containernil
proxy.enabledIf true, registry will function as a proxy/mirrorfalse
proxy.remoteurlRemote registry URL to proxy requests tohttps://registry-1.docker.io
proxy.usernameRemote registry login usernamenil
proxy.passwordRemote registry login passwordnil
proxy.secretRefThe ref for an external secret containing the proxyUsername and proxyPassword keys""
namespacespecify a namespace to install the chart to - defaults to .Release.Namespace{{ .Release.Namespace }}
nodeSelectornode labels for pod assignment{}
affinityaffinity settings{}
tolerationspod tolerations[]
ingress.enabledIf true, Ingress will be createdfalse
ingress.annotationsIngress annotations{}
ingress.labelsIngress labels{}
ingress.pathIngress service path/
ingress.hostsIngress hostnames[]
ingress.tlsIngress TLS configuration (YAML)[]
ingress.classNameIngress controller class namenginx
metrics.enabledEnable metrics on Servicefalse
metrics.portTCP port on which the service metrics is exposed5001
metrics.serviceMonitor.annotationsPrometheus Operator ServiceMonitor annotations{}
metrics.serviceMonitor.enableIf true, Prometheus Operator ServiceMonitor will be createdfalse
metrics.serviceMonitor.labelsPrometheus Operator ServiceMonitor labels{}
metrics.prometheusRule.annotationsPrometheus Operator PrometheusRule annotations{}
metrics.prometheusRule.enableIf true, Prometheus Operator prometheusRule will be createdfalse
metrics.prometheusRule.labelsPrometheus Operator prometheusRule labels{}
metrics.prometheusRule.rulesPrometheusRule defining alerting rules for a Prometheus instance{}
extraVolumeMountsAdditional volumeMounts to the registry container[]
extraVolumesAdditional volumes to the pod[]
extraEnvVarsAdditional environment variables to the pod[]
initContainersInit containers to be created in the pod[]
garbageCollect.enabledIf true, will deploy garbage-collector cronjobfalse
garbageCollect.deleteUntaggedIf true, garbage-collector will delete manifests that are not currently referenced via tagtrue
garbageCollect.scheduleCronTab schedule, please use standard crontab format0 1 * * *
garbageCollect.podAnnotationsCronJob pod Annotations. If left empty and chart podAnnotations are set, will use those. If both are set, these take precedence for the garbageCollect pods.{}
garbageCollect.podLabelsCronJob pod Annotations. If left empty and chart podLabels are set, will use those. If both are set, these take precedence for the garbageCollect pods.{}
garbageCollect.resourcesgarbage-collector requested resources{}

Specify each parameter using the --set key=value[,key=value] argument to helm install.

To generate htpasswd file, run this docker command: docker run --entrypoint htpasswd httpd:2 -Bbn user password > ./htpasswd.