Containerized Benji


The container images are hosted in the GitHub Container Registry:



The latest tag always points to the latest released version. Images for all Git branches of the repository are available under their branch name, i.e. the current development version is available by referring to the master tag.


Older versions of the images are still available on Docker Hub, but no new images will be published there.


The images is based on CentOS 7. Ceph and iSCSI support are present.

The Benji configuration should be put into /etc/benji/benji.yaml. Either by inheriting from this image and overwriting it or by mounting it directly into the container. By default a minimal test configuration is provided by the image.

The default entry point is just /bin/bash.

One use case for this image is for testing Benji:

docker run --interactive --tty --rm

After that you can directly proceed with step 1 of the instructions in section Quick Start.


This image is directly derived from the benji image above. It includes a number of scripts to do backups of Kubernetes persistent volumes backed by Ceph RBD:

  • benji-backup-pvc for doing backups

  • benji-restore-pvc for restore operations to either existing or new PVCs/PVs

  • benji-command for all other Benji commands

  • benji-versions-status publishes the number of invalid or incomplete versions as Prometheus metrics

The scripts provide support for volumes provisioned by the classic RBD volume provider, by Rook Ceph CSI and by Ceph CSI.

Example usages:

benji-backup-pvc --all-namespaces -l 'release in (prod)'
benji-backup-pvc --namespace staging
benji-command enforce latest3,hours24,days30,months3 'labels[""] == "benji-k8s"'
benji-command cleanup
benji-command batch-deep-scrub --version-percentage 10 --block-percentage 33 'labels[""] == "benji-k8s"'

The backup script benji-backup-pvc first searches for PersistemtVolumeClaims matching the selector supplied on the command line. Direct backups of PersistentVolumes are currently not supported by this script.

benji-command enforce should be called regularly to expire old backup versions. Also benji-command cleanup needs to be executed once in a while to actually remove blocks that are no longer used from the storages.

At the end of each command Prometheus metrics are pushed to the configured pushgateway. The format of the variable is host:port. If host part is left blank localhost is assumed. If PROM_PUSH_GATEWAY is not set, this step is skipped.

The backup script uses Ceph’s differential backup features if possible. Normally only the initial backup is a full backup. RBD snapshots names are generated with a prefix of b-.

Helm Chart

The Helm chart is the preferred way to deploy Benji inside a Kubernetes cluster. There is a chart repository available at

helm repo add benji

The chart is named benji and with the repository definition above the chart would be referenced as benji/benji.


The deployed resources create a service account which has the right to get, list and watch all PersistentVolume, PersistentVolumeClaim, Storageclasses and Pod resources in all namespaces. Additionally it is able to create Events and PersistentVolumeClaims.