mrkeyoor.com_
Sun 27 Sept 03:24 UTC
Self-Hostedevaluationupdated 27 Sept 2026

distribution review

Distribution is the open-source registry server that stores and serves container images and other OCI content. It gives teams the storage layer behind a private registry, without adding a full management console, vulnerability scanner, or policy suite.

Verdict

Our Distribution build passed in 86 seconds, but 3 of 77 test packages failed after a 419-second run, so adopt it as infrastructure you will test and operate, not as a finished appliance. It is a good fit when you want a plain OCI registry core, can use the supported image, and already own authentication, TLS, monitoring, backups, and storage validation. Choose Harbor or Quay when the organization needs a registry product with policy and a user interface.

We ran it

Lab card: what happened when we ran distributionScreenshot of distribution (distribution.github.io/distribution)
Install✓ · 52s0 packages
Build✓ · 86s
Tests✗ · 419s74 passed · 3 failed of 77 (go test)
Repo620 files~56,148 lines of source · 10.2 MB · 10 CI workflows · Dockerfile · tests dir

Answers from our run

Does distribution build from source?

Dependencies installed in 52 seconds (0 packages), and the build succeeded in 86 seconds. We cloned commit 3220848 into a clean Debian container with 3 CPUs and no project-specific setup.

Do distribution's tests pass?

Not all of them: 74 of 77 passed and 3 failed when we ran the project's own test command (go test). Some failures need services or credentials a bare container does not have.

Who should not use distribution?

Teams that want scanning, signing workflows, replication policy, and a user-facing administration layer in one product: Distribution supplies the registry core, not that full platform.

What are the alternatives to distribution?

Harbor, zot, Quay. Our Distribution build passed in 86 seconds, but 3 of 77 test packages failed after a 419-second run, so adopt it as infrastructure you will test and operate, not as a finished appliance.

Setup4/552-second install and 86-second build; 3 test packages failed
Docs4/5Good build and config docs, but operations span many linked pages
Community5/510,627 stars and active issue work through September 2026
Maturity4/5v3.1.2 is active; open GC and proxy TTL reports need caution

Who it’s for

Platform teams that need a private OCI registry and want direct control over storage, authentication, caching, and deployment.
Product builders embedding registry behavior into a larger service and willing to work around unstable Go library interfaces.
Operators who prefer a small registry core over a broader platform such as Harbor or Quay.

Who it’s NOT for

Teams that want scanning, signing workflows, replication policy, and a user-facing administration layer in one product: Distribution supplies the registry core, not that full platform.
Applications that need a stable Go library contract: the README explicitly calls the library interfaces unstable and deprecates its client in favor of containerd's implementation.
Operators planning unattended garbage-collect --delete-untagged runs without backups and verification: open issue 4939 reports live shared blobs being deleted on v3.1.1.
Pull-through caches that depend on blob TTL to cap disk use without their own checks: issue 4957 reports blob expiry returning ErrUnsupported on v3.1.1 and main.

Setup reality

Our sandbox install succeeded in 52 seconds with 0 packages added. The build passed in 86 seconds. Tests ended with exit code 1 after 419 seconds: 74 passed and 3 failed out of 77, with the log tail identifying the in-memory storage driver package as failed after 360.780 seconds.

A basic source run needs Go, a configuration file, and writable registry storage. Real deployments also need TLS, authentication, an HTTP secret when several instances share uploads, and credentials for any remote storage backend. The sample uses filesystem storage and htpasswd authentication.

Release v3.1.2 requires Go 1.26 or newer for source builds. Validation needs Docker with Buildx, and the local S3 test path needs a Compose-compatible tool plus MinIO credentials. The README says most users should start with the prebuilt registry image rather than compile it.

A registry engine with 620 files, not a registry product

Distribution implements the server side of the OCI Distribution Specification, the HTTP contract container tools use to push and pull images and other artifacts. The repository says its registry code sits under services including Docker Hub, GitHub Container Registry, GitLab Container Registry, DigitalOcean Container Registry, and Harbor. That pedigree matters, but it can also mislead a buyer about the package in front of them. This project is the engine room. It does not arrive with the policy, scanning, replication controls, and operator interface many teams picture when they hear "private registry."

The checkout we measured contained 620 files, about 56,148 lines of source, and 10.2 MB of code. Its main deliverable is the registry server, accompanied by Go libraries and documentation. The README warns that the library interfaces are unstable. It also says the included client is deprecated in favor of containerd's implementation and will not receive new features. Running the server is the safer center of gravity. Embedding its packages means accepting more change than the OCI HTTP interface exposes.

The prebuilt image is the documented path for most users

Distribution's build guide tells casual users to choose a prebuilt Registry image. Source builds are aimed at contributors and people making a custom image. Release v3.1.2 raises that source requirement to Go 1.26 or newer, while make validate also expects Docker with the Buildx plugin. Those are reasonable development requirements, but they are work you can avoid when the published image already matches the deployment.

A minimal configuration listens on port 5000, stores blobs under /var/lib/registry, caches blob descriptors in memory, and can use htpasswd authentication. A production service needs more decisions: TLS termination, persistent storage, access control, health checks, upload cleanup, and a shared HTTP secret if several instances handle uploads. Cloud storage brings provider credentials and failure modes. The local S3 development recipe alone adds a Compose-compatible runtime, MinIO, a bucket, region settings, and access credentials.

What happened when we ran it

Our sandbox install succeeded in 52 seconds and added 0 packages. The build completed in 86 seconds in a fresh unprivileged Debian container with 3 CPUs and 8 GB of RAM. That is a clean result for compiling the registry itself, and the repository includes both a Dockerfile and 10 CI workflow files. The checked-out commit was 3220848, so these figures describe that source snapshot rather than every v3 image.

The test step did not pass. It ran for 419 seconds, then reported 74 passed and 3 failed out of 77. The final package summary shows the failure under registry/storage/driver/inmemory, which took 360.780 seconds; nearby filesystem, Azure, GCS, S3, and middleware packages passed. The supplied tail does not name the three assertions or establish a cause. We can say the full suite failed in our container, and no more.

That distinction changes the trial plan. A successful 86-second compile proves that the source is buildable in the stated Go image. It does not clear the in-memory driver or prove a chosen object store behaves correctly under interruption, concurrency, or garbage collection. Before production, run the relevant driver tests on the exact release, storage service, credentials, and network path you intend to use.

Garbage collection needs backups and a post-run check

Open issue 4939 reports that garbage-collect --delete-untagged on registry v3.1.1 sometimes removed a blob still referenced by 9 repositories. The reporter describes several incidents over about 2 weeks and says restoring the blob from backup made the affected tags pull again. There is no minimal reproduction in the issue, so it is not proof that every deployment is exposed. It is enough reason to avoid treating destructive collection as routine housekeeping without a dry run, backup, and manifest-to-blob verification.

Pull-through caches have a separate warning. Issue 4957 traces blob TTL expiry on v3.1.1 to a Delete method that returns ErrUnsupported, leaving the cleanup path before it removes the cached blob. The reporter says the behavior remained in main when filed. That is a specific report, not a substitute for checking v3.1.2 or a later commit. If disk limits depend on TTL, measure reclaimed bytes and alert on growth instead of trusting the configured duration.

September 2026 activity is current, while operations remain yours

GitHub recorded 10,627 stars, 518 open issues and pull requests, and a last push on September 26, 2026. Release v3.1.2 arrived on September 24 with a digest-verification security fix, storage and pagination fixes, dependency updates, and the Go 1.26 requirement. Recent issue discussion covers configuration isolation, cache expiry, and garbage collection. This is active maintenance around software that handles persistent content, not a dormant repository coasting on its name.

Distribution is the right choice when the OCI registry protocol is the product boundary you want. It stays close to the storage and transport job, and its Apache-2.0 license leaves room for custom services around it. That narrowness also writes the operator's checklist: put authentication and TLS in place, pin the release, back up the blobs, test the chosen driver, and verify cleanup. If your team wants those choices packaged into an administrative product, start with Harbor or Quay instead.

Alternatives

ProjectWhat it isPick it when
Harbor gh↗A registry platform with scanning, signing, replication, policy, and a web interface.pick this instead when your team wants an operated registry product rather than a registry engine to assemble.
zot gh↗An OCI-native registry focused on a compact binary and extension-based features.pick this instead when you want a smaller operator-facing registry with built-in OCI artifact features.
QuayA container registry with a web interface, access controls, build integrations, and scanning hooks.pick this instead when teams need a shared registry service with more product surface and administration tools.

What people are saying

  1. [github-trending] distribution/distribution
  2. [lobsters] The smallest possible Linux distribution
  3. [lobsters] Trusting-Trust Attack against an Entire Linux Distribution (via the strip utility)
  4. [theverge] Debian won’t ban AI code from its Linux distribution
  5. [lobsters] EasyEffects should be part of every Linux distribution to improve laptop speaker sound quality

Sources

  1. Distribution repository
  2. Distribution README
  3. Distribution build guide
  4. Distribution v3.1.2 release
  5. Garbage collection blob deletion report
  6. Pull-through cache TTL report

More self-hosted reviews

reth · umbrel · openbao · NewPipe · CFBox · wg-easy · the whole board →