Safeguard
Developer Tools•

Why did deleting container images not free any registry space?

Shared layers, untagging and delayed reclamation explain why space does not drop right away. What to check and how long to wait before you worry.

Safeguard Security Team
3 min read

Usually one of three reasons: you untagged rather than deleted, the layers are shared with images that remain, or the registry reclaims space later. Azure documents all three. Only layers unique to a deleted image are removed, and cleanup of storage is asynchronous.

Reason one: untagging frees nothing

Removing a tag leaves the manifest and its layers in place. Azure's documentation says no space is freed when you untag, because only the tag reference is deleted. If your cleanup step removes tags only, the registry stays full. See untag, delete by tag or delete by digest.

Reason two: layers are shared

Images are built from layers, and many images share the same base layers. When you delete an image, only layers not referenced by other images are removed. Azure says deleting by tag recovers space used by unique layers, and shared layer data is not deleted.

This explains an odd effect: deleting ten old images may free little if they all share a large base with the images you keep. The base layer stays until nothing references it.

What you deleteWhat is removed
A tag reference onlyThe tag
An image by tag or digestManifest, its tags, layers unique to it
A whole repositoryAll images in it and their unique layers

Reason three: reclamation is asynchronous

Azure notes that after you delete image data, billing for the associated storage stops immediately, but the registry recovers the space with an asynchronous process, so it takes time before cleanup shows in usage. Other registries may behave differently. Self hosted registries often need an explicit garbage collection run, which is why our post on how Docker registry garbage collection works is worth reading if you run your own.

Reason four: you deleted the wrong things

If the images you removed are small and the big ones remain, usage barely moves. Look at which repositories use the most space, not just which have the most tags.

A troubleshooting order

  1. Confirm the operation was a delete, not an untag.
  2. Check whether the images share layers with ones you kept.
  3. Wait for the asynchronous cleanup, then recheck.
  4. For a self hosted registry, check whether garbage collection has run.
  5. Find the largest repositories and focus there.

Why this matters for security

Space is a side effect. The security point is inventory: images you no longer need should not remain pullable. Measure success by the number of repositories and tags you can no longer pull, not by storage numbers. See is deleting old images a security control.

Set expectations with your team

If a cleanup is meant to cut usage, tell stakeholders that the number may not drop for a while and may drop less than expected. Pair the usage figure with a count of repositories and tags removed, which moves immediately and is closer to the real security goal.

Quick check

How long until space is reclaimed?

Azure describes it as asynchronous without a fixed time. Recheck later, and for self hosted registries run garbage collection.

Does deleting a shared base layer image free the base?

No. Shared layers stay until no remaining image references them.

Sources

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.