Private container registries
Many organizations require Kubernetes to pull every image from a private container registry. This page lists the images that each Posit Helm chart uses. It also shows the Helm values that point each image at your registry and supply registry credentials.
For a full values.yaml file for each product, see the private image examples:
Images used by the charts
Copy each image that you use into your private registry, and keep the same tags. The tables show the default image for chart version 0.20.0 and later. The posit/ images are on Docker Hub. The same images are also on GitHub Container Registry under ghcr.io/posit-dev/. The Chronicle images are on GitHub Container Registry under ghcr.io/rstudio/, which the chart sets with the registry value.
By default, the charts tag product images as <appVersion>-<os>, for example 2026.10.0-ubuntu-24.04. Init container images use the tag <appVersion>, which corresponds to the Posit product version. An init container is a container that runs before the main container in a pod. To pin an exact tag, set the tag value next to the repository value.
Posit Connect
| Image | Purpose | Helm value |
|---|---|---|
posit/connect |
Connect server | image.repository |
posit/connect-content-init |
Copies Connect runtime components into content pods | backends.kubernetes.defaultInitContainer.repository |
posit/connect-content or your own image |
Runs content | executionEnvironments[].name |
rstudio/chronicle-agent |
Chronicle agent, if chronicleAgent.enabled is true |
chronicleAgent.image.registry and chronicleAgent.image.repository |
Posit Workbench
| Image | Purpose | Helm value |
|---|---|---|
posit/workbench |
Workbench server | image.repository |
posit/workbench-session |
Runs sessions | session.image.repository |
posit/workbench-session-init |
Copies Workbench session components into session pods | components.sessionInit.image.repository |
posit/workbench-positron-init |
Copies Positron into session pods, if components.positron.version is set |
components.positron.image.repository |
rstudio/chronicle-agent |
Chronicle agent, if chronicleAgent.enabled is true |
chronicleAgent.image.registry and chronicleAgent.image.repository |
prom/graphite-exporter |
Metrics exporter, if prometheus.legacy is true |
prometheusExporter.image.repository |
Posit Package Manager
| Image | Purpose | Helm value |
|---|---|---|
posit/package-manager |
Package Manager server | image.repository |
Posit Chronicle
| Image | Purpose | Helm value |
|---|---|---|
rstudio/chronicle |
Chronicle server | image.registry and image.repository |
List the images for your release
The image list depends on your chart version and your values. To print the exact image references, render the chart with your values file:
Terminal
helm template rstudio/rstudio-connect --values values.yaml | grep -E 'image(-name|-tag)?[:=]'Replace rstudio/rstudio-connect with the chart that you install. Workbench sets the session images in the rserver.conf file, so the pattern also finds the image=, image-name=, and image-tag= lines in that file.
Authenticate to the registry
Kubernetes needs credentials to pull from a private registry. You can give Kubernetes these credentials in two ways.
- Node-level credentials
- Some managed Kubernetes services let nodes pull from the provider registry. Examples are Amazon EKS with Amazon ECR, and Azure Kubernetes Service with Azure Container Registry. If your nodes can already pull from your registry, you do not need image pull secrets. Go to Point the charts at your registry.
- Image pull secrets
- An image pull secret is a Kubernetes Secret that holds registry credentials. You reference it from each pod that pulls an image. This approach works on all clusters and does not need permission to change the node configuration.
Create an image pull secret
Create the Secret in the namespace where you install the chart. The command creates a Secret of type kubernetes.io/dockerconfigjson.
Terminal
kubectl create secret docker-registry private-registry-creds \
--namespace posit \
--docker-server=registry.example.com \
--docker-username=<username> \
--docker-password=<password-or-token>Content pods and session pods can run in a different namespace than the server. Connect uses backends.kubernetes.namespace and Workbench uses launcher.namespace. If you set one of these values, create the Secret in that namespace too.
For other ways to create the Secret, see Pull an image from a private registry in the Kubernetes documentation.
Point the charts at your registry
In the examples below, replace registry.example.com with your registry host. Replace private-registry-creds with the name of your Secret. If you use node-level credentials, remove the imagePullSecrets entries.
In each chart, image.imagePullSecrets applies only to the server pod. Connect content pods and Workbench session pods need the Secret in a second place. That Secret covers the main image and the init container images in the pod.
Posit Connect
values.yaml
image:
repository: registry.example.com/posit/connect
imagePullSecrets:
- name: private-registry-creds
backends:
kubernetes:
enabled: true
defaultInitContainer:
repository: registry.example.com/posit/connect-content-init
# The Secret that content pods use to pull images
defaultResourceJobBase:
spec:
template:
spec:
imagePullSecrets:
- name: private-registry-creds
executionEnvironments:
- name: registry.example.com/posit/connect-content:R4.5.2-python3.14.3-ubuntu-24.04
# ...Posit Workbench
values.yaml
image:
repository: registry.example.com/posit/workbench
imagePullSecrets:
- name: private-registry-creds
session:
image:
repository: registry.example.com/posit/workbench-session
components:
sessionInit:
image:
repository: registry.example.com/posit/workbench-session-init
positron:
image:
repository: registry.example.com/posit/workbench-positron-init
launcher:
templateValues:
pod:
# The Secret that session pods use to pull images
imagePullSecrets:
- name: private-registry-credsThe launcher.templateValues values apply only when launcher.useTemplates is true. This is the default.
Posit Package Manager
values.yaml
image:
repository: registry.example.com/posit/package-manager
imagePullSecrets:
- name: private-registry-credsPosit Chronicle
The Chronicle chart has no imagePullSecrets value. Instead, attach the Secret to a service account and tell the chart to use that service account. Kubernetes adds the image pull secrets of a service account to each pod that uses it.
Create a service account that references the Secret:
Terminal
kubectl create serviceaccount chronicle --namespace posit kubectl patch serviceaccount chronicle --namespace posit \ --patch '{"imagePullSecrets": [{"name": "private-registry-creds"}]}'Set the registry and the service account in your values:
values.yaml
image: registry: registry.example.com repository: rstudio/chronicle serviceAccount: create: false name: chronicle
Chronicle agent
The Connect and Workbench charts can run a Chronicle agent in the server pod. If you enable the agent, set its registry in the Connect or Workbench values:
values.yaml
chronicleAgent:
image:
registry: registry.example.com
repository: rstudio/chronicle-agentThe agent runs in the server pod, so image.imagePullSecrets covers it.
Use a service account for content and session pods
You can attach the Secret to a service account instead of the pod values above. For example, you can patch the service account that Connect content pods or Workbench session pods use. Use the kubectl patch serviceaccount command from the Chronicle section.
Troubleshooting
If a pod cannot pull an image, Kubernetes reports an ErrImagePull or ImagePullBackOff status. To see the image reference and the error from the registry, describe the pod:
Terminal
kubectl describe pod <pod-name> --namespace positThen make sure that:
- The image and the tag exist in your registry.
- The Secret exists in the same namespace as the pod.
- The server in the Secret matches the registry host in the image reference.
- The pod references the Secret. Content pods and session pods need the Secret in their own values, as shown above.