Fifty tags of one app
Far less than fifty images, because the base is stored once
base: 120MB app: 15MB tags: 50
Work out what a registry holds. The answer is much smaller than tags times image size, and much larger than the tag count suggests after a cleanup.
Or drop a file anywhere on this panel. Nothing is uploaded: the analysis runs in this tab.
The answer appears here
Paste on the left and press Calculate. Nothing leaves this tab.
Nothing else to flag.
No formatting problems, and nothing the rules object to. Worth remembering what that covers: this reads the file you pasted, not the account or cluster it will be applied to.
No finding matches that filter.
Real input you can load into the tool above. Each one shows a different thing going wrong, because that is what the tool is for.
Far less than fifty images, because the base is stored once
base: 120MB app: 15MB tags: 50
Storage and pull time are both dominated by something identical in every tag
base: 500MB app: 5MB tags: 10
These are the ones that fail silently. The config is accepted, nothing raises an error, and the consequence arrives later.
Layers are shared by digest, so the shared base is stored once. The estimate can be an order of magnitude too high.
Instead:Count the base once and the changing layer per tag.
The blobs stay until garbage collection runs, which on the distribution registry needs a read-only maintenance window.
Instead:Schedule garbage collection, and check what a managed registry's lifecycle policy actually reclaims.
Every source change invalidates the install layer, so every build stores a fresh copy of all the dependencies.
Instead:Copy the manifest files, install, then copy the source.
An identical base layer is stored once however many tags reference it. So fifty builds of one application cost the base plus fifty small layers, not fifty full images.
Put what changes least first. A dependency install above the source COPY keeps the expensive layer shared across every build; below it, every build produces a new copy of everything.
Deleting a manifest removes the reference and leaves every blob in place. For the CNCF distribution registry, garbage collection is a separate command that needs the registry read-only, because otherwise it can delete a blob an in-flight push is about to reference. So storage grows while the tag count falls.
Some reclaim storage and some only hide tags. Worth checking rather than assuming, because the billing follows the storage rather than the tag list.
A new base is a completely new set of blobs, shared by nothing already stored, and every image built on it pulls it fresh. That is why an idle base image bump shows up as a spike in both storage and egress.
An arm64 layer has a different digest from the amd64 one even for identical source, so a two-platform image is close to twice the storage, plus the attestation blobs BuildKit adds. Multi-arch is worth having and is not free.
A registry stores the compressed blobs, which is smaller than what docker images reports, because that is the extracted size on disk. Use the compressed number for registry cost and the extracted one for node disk planning.