Skip to main content
· Containers · 3 min read

When Bitnami Changed Their Docker Repository: A Vendor Lock-In Postmortem

Last week started like any other. I pushed a small update to one of my services, hit deploy… and suddenly everything blew up. Kubernetes jobs failed, Helm upgrades didn’t go through, and the console was full of errors about missing Docker images.

After some digging: Bitnami had changed their Docker repository policy and naming convention. Images that lived under bitnami/ were moved to bitnamilegacy/, and anything other than latest became unavailable. That meant every chart or Kubernetes manifest pinning a specific version (bitnami/postgresql:17, bitnami/redis:6) was now pulling from a namespace that didn’t have it.

What Broke

%%{ init: { 'look': 'handDrawn' } }%%
graph TB
    A[Before: bitnami/postgresql:17] -->|exists| B[Works fine<br/>for years]
    
    C[After: bitnami/postgresql:17] -->|moved to<br/>bitnamilegacy| D[Pull fails<br/>manifest broken]
    
    E[bitnami/postgresql:latest] -->|still works<br/>but risky| F[No version pinning<br/>moving target]
    
    G[CI pipeline<br/>kubectl apply] -->|image not found| H[Job pods<br/>CrashLoopBackOff]
    
    G -->|helm upgrade| I[Pre-upgrade hook<br/>fails: image missing]

The community reaction was fast — GitHub issues, Reddit threads, Hacker News posts. Many pipelines broke simultaneously because the change was introduced without sufficient notice or migration tooling.

The Recovery Path

%%{ init: { 'look': 'handDrawn' } }%%
graph LR
    A[Broken deployment] --> B[Temporary: switch to<br/>bitnamilegacy namespace]
    B --> C[Short-term: find<br/>community forks]
    B --> D[Long-term: migrate to<br/>official upstream images]
    
    C --> E[e.g., dpage/pgadmin4<br/>for PostgreSQL]
    D --> F[official Docker Hub<br/>postgresql image]
    F --> G[Helm chart using<br/>official images]
    
    E --> G

For PostgreSQL specifically, the official Docker Hub postgres image is a solid replacement. The Helm chart community also rallied quickly — most popular charts now have alternative image references that don’t depend on Bitnami’s namespace.

What We Learn

1. Image tags are not stable contracts

# Unstable: moves when the namespace changes
image: bitnami/postgresql:17

# More stable: official source
image: postgres:17

# Pin by digest: never changes
image: postgres@sha256:abc123...

A Docker image tag can be renamed, deleted, or re-tagged at any time. Pinning to a digest (@sha256:...) creates an immutable reference.

2. Single-vendor dependency is a risk

DependencyRisk
Bitnami imagesCan change namespace without warning
Helm chart from one maintainerCan be abandoned or significantly changed
Third-party Terraform providerCan change API or deprecate features

For production systems, maintain a mapping of “what we’d use if X disappears” — even if it’s just a note in a runbook.

3. Community forks are the early warning system

%%{ init: { 'look': 'handDrawn' } }%%
graph LR
    A[Vendor changes<br/>breaking policy] --> B[Community notices<br/>GitHub issues fill up]
    B --> C[Community forks<br/>alternative charts]
    C --> D[Early adopters test<br/>forked solutions]
    D --> E[Stable alternative<br/>emerges in weeks]

The open-source community’s response to Bitnami’s change was fast. Within days, alternative Helm charts were appearing on ArtifactHub. The ecosystem self-healed — but teams that didn’t monitor their CI pipelines (or didn’t have alerting) suffered silent failures.

What I Changed After This

  1. Pinned images by digest in addition to tag — image: postgres@sha256:abc123 won’t break if the tag moves
  2. Monitored Helm chart repositories — added a weekly check for chart updates and deprecations
  3. Built internal mirror of critical images — prevents external dependency on image availability

Vendor lock-in isn’t just about cloud providers. It applies equally to the container images and Helm charts you depend on. One namespace change brought down many pipelines. Don’t let it happen to yours.