Container Backends

Configure Docker or Kubernetes as the container backend for code review jobs.

Overview

When deployed as a platform, each code review runs in an isolated container that is destroyed after completion. Reviewate supports two container backends:

FeatureDockerKubernetes
Resource limitsYesYes
Non-root executionYesYes
Network isolationYesYes (+ NetworkPolicy)
Namespace isolationNoYes
Pod security contextNoYes
Node selectors/tolerationsNoYes
Service account RBACNoYes

Docker Backend

Default for Docker Compose deployments. Configuration in backend/configs/docker.yaml:

container:
  enabled: true
  backend: docker
  watcher:
    enabled: true
    reconcile_interval: 60
  docker:
    socket: tcp://docker-proxy:2375
    image: reviewate/code-reviewer:latest
    network: reviewate_reviewate-network
    memory_limit: 4g
    cpu_limit: 2.0
    timeout: 600
    cleanup_containers: false

Docker Options

OptionDefaultDescription
sockettcp://docker-proxy:2375Docker daemon socket
imagereviewate/code-reviewer:latestCode reviewer container image
networknullDocker network to attach containers to
memory_limit4gMaximum memory per container
cpu_limit2.0Maximum CPU cores per container
timeout600Timeout in seconds (10 minutes)
cleanup_containersfalseRemove containers after completion

Kubernetes Backend

For production deployments. Configuration in backend/configs/kubernetes.yaml:

container:
  enabled: true
  backend: kubernetes
  watcher:
    enabled: true
    reconcile_interval: 60
  kubernetes:
    namespace: reviewate
    image: reviewate/code-reviewer:latest
    service_account: reviewate
    timeout: 600
    memory_limit: 4Gi
    memory_request: 1Gi
    cpu_limit: "2"
    cpu_request: 500m
    image_pull_policy: IfNotPresent
    cleanup_jobs: true
    run_as_non_root: true
    run_as_user: 1000
    run_as_group: 1000

Kubernetes Options

OptionDefaultDescription
namespacereviewateNamespace for review jobs
imagereviewate/code-reviewer:latestCode reviewer container image
service_accountreviewateService account for pods
timeout600Timeout in seconds
memory_limit4GiMemory limit per pod
memory_request1GiMemory request per pod
cpu_limit2CPU limit per pod
cpu_request500mCPU request per pod
image_pull_policyIfNotPresentWhen to pull the image
cleanup_jobstrueDelete completed jobs
run_as_non_roottrueEnforce non-root execution
run_as_user1000UID to run containers as
run_as_group1000GID to run containers as

Environment Variable Overrides

Some Kubernetes options can be set via environment variables:

KUBE_NAMESPACE=reviewate-jobs
KUBE_SERVICE_ACCOUNT=reviewate
KUBE_CLEANUP_JOBS=true

Container Watcher

Both backends use a watcher that monitors container status via the runtime API:

  • Docker: Watches Docker events for container state changes
  • Kubernetes: Watches pod status via the Kubernetes API

The watcher also runs periodic reconciliation (default: every 60 seconds) to catch any missed events and clean up stale containers.

watcher:
  enabled: true
  reconcile_interval: 60  # seconds

Security Comparison

Docker provides basic isolation through resource limits and non-root execution. Containers share the Docker network unless explicitly configured.

Kubernetes adds namespace-level isolation, NetworkPolicy enforcement, pod security contexts, and RBAC. This makes it the recommended choice for production deployments with sensitive codebases.

See Container Isolation for the full security model.