mirror of
https://github.com/go-gitea/gitea.git
synced 2026-08-02 06:25:51 -05:00
Automatically clean up docker images in the registry without a tag pointing to them #9774
Open
opened 2025-11-02 08:49:10 -06:00 by GiteaMirror
·
21 comments
No Branch/Tag Specified
main
release/v1.25
release/v1.24
release/v1.23
release/v1.22
release/v1.21
release/v1.20
release/v1.19
release/v1.18
release/v1.17
release/v1.16
release/v1.15
release/v1.14
release/v1.13
release/v1.12
release/v1.11
release/v1.10
release/v1.9
release/v1.8
v1.25.3
v1.25.2
v1.25.1
v1.25.0
v1.24.7
v1.25.0-rc0
v1.26.0-dev
v1.24.6
v1.24.5
v1.24.4
v1.24.3
v1.24.2
v1.24.1
v1.24.0
v1.23.8
v1.24.0-rc0
v1.25.0-dev
v1.23.7
v1.23.6
v1.23.5
v1.23.4
v1.23.3
v1.23.2
v1.23.1
v1.23.0
v1.23.0-rc0
v1.24.0-dev
v1.22.6
v1.22.5
v1.22.4
v1.22.3
v1.22.2
v1.22.1
v1.22.0
v1.23.0-dev
v1.22.0-rc1
v1.21.11
v1.22.0-rc0
v1.21.10
v1.21.9
v1.21.8
v1.21.7
v1.21.6
v1.21.5
v1.21.4
v1.21.3
v1.21.2
v1.20.6
v1.21.1
v1.21.0
v1.21.0-rc2
v1.21.0-rc1
v1.20.5
v1.22.0-dev
v1.21.0-rc0
v1.20.4
v1.20.3
v1.20.2
v1.20.1
v1.20.0
v1.19.4
v1.21.0-dev
v1.20.0-rc2
v1.20.0-rc1
v1.20.0-rc0
v1.19.3
v1.19.2
v1.19.1
v1.19.0
v1.19.0-rc1
v1.20.0-dev
v1.19.0-rc0
v1.18.5
v1.18.4
v1.18.3
v1.18.2
v1.18.1
v1.18.0
v1.17.4
v1.18.0-rc1
v1.19.0-dev
v1.18.0-rc0
v1.17.3
v1.17.2
v1.17.1
v1.17.0
v1.17.0-rc2
v1.16.9
v1.17.0-rc1
v1.18.0-dev
v1.16.8
v1.16.7
v1.16.6
v1.16.5
v1.16.4
v1.16.3
v1.16.2
v1.16.1
v1.16.0
v1.15.11
v1.17.0-dev
v1.16.0-rc1
v1.15.10
v1.15.9
v1.15.8
v1.15.7
v1.15.6
v1.15.5
v1.15.4
v1.15.3
v1.15.2
v1.15.1
v1.14.7
v1.15.0
v1.15.0-rc3
v1.14.6
v1.15.0-rc2
v1.14.5
v1.16.0-dev
v1.15.0-rc1
v1.14.4
v1.14.3
v1.14.2
v1.14.1
v1.14.0
v1.13.7
v1.14.0-rc2
v1.13.6
v1.13.5
v1.14.0-rc1
v1.15.0-dev
v1.13.4
v1.13.3
v1.13.2
v1.13.1
v1.13.0
v1.12.6
v1.13.0-rc2
v1.14.0-dev
v1.13.0-rc1
v1.12.5
v1.12.4
v1.12.3
v1.12.2
v1.12.1
v1.11.8
v1.12.0
v1.11.7
v1.12.0-rc2
v1.11.6
v1.12.0-rc1
v1.13.0-dev
v1.11.5
v1.11.4
v1.11.3
v1.10.6
v1.12.0-dev
v1.11.2
v1.10.5
v1.11.1
v1.10.4
v1.11.0
v1.11.0-rc2
v1.10.3
v1.11.0-rc1
v1.10.2
v1.10.1
v1.10.0
v1.9.6
v1.9.5
v1.10.0-rc2
v1.11.0-dev
v1.10.0-rc1
v1.9.4
v1.9.3
v1.9.2
v1.9.1
v1.9.0
v1.9.0-rc2
v1.10.0-dev
v1.9.0-rc1
v1.8.3
v1.8.2
v1.8.1
v1.8.0
v1.8.0-rc3
v1.7.6
v1.8.0-rc2
v1.7.5
v1.8.0-rc1
v1.9.0-dev
v1.7.4
v1.7.3
v1.7.2
v1.7.1
v1.7.0
v1.7.0-rc3
v1.6.4
v1.7.0-rc2
v1.6.3
v1.7.0-rc1
v1.7.0-dev
v1.6.2
v1.6.1
v1.6.0
v1.6.0-rc2
v1.5.3
v1.6.0-rc1
v1.6.0-dev
v1.5.2
v1.5.1
v1.5.0
v1.5.0-rc2
v1.5.0-rc1
v1.5.0-dev
v1.4.3
v1.4.2
v1.4.1
v1.4.0
v1.4.0-rc3
v1.4.0-rc2
v1.3.3
v1.4.0-rc1
v1.3.2
v1.3.1
v1.3.0
v1.3.0-rc2
v1.3.0-rc1
v1.2.3
v1.2.2
v1.2.1
v1.2.0
v1.2.0-rc3
v1.2.0-rc2
v1.1.4
v1.2.0-rc1
v1.1.3
v1.1.2
v1.1.1
v1.1.0
v1.0.2
v1.0.1
v1.0.0
v0.9.99
Labels
Clear labels
$20
$250
$50
$500
backport/done
💎 Bounty
docs-update-needed
good first issue
hacktoberfest
issue/bounty
issue/confirmed
issue/critical
issue/duplicate
issue/needs-feedback
issue/not-a-bug
issue/regression
issue/stale
issue/workaround
lgtm/need 2
modifies/api
modifies/translation
outdated/backport/v1.18
outdated/theme/markdown
outdated/theme/timetracker
performance/bigrepo
performance/cpu
performance/memory
performance/speed
pr/breaking
proposal/accepted
proposal/rejected
pr/wip
pull-request
reviewed/wontfix
💰 Rewarded
skip-changelog
status/blocked
topic/accessibility
topic/api
topic/authentication
topic/build
topic/code-linting
topic/commit-signing
topic/content-rendering
topic/deployment
topic/distribution
topic/federation
topic/gitea-actions
topic/issues
topic/lfs
topic/mobile
topic/moderation
topic/packages
topic/pr
topic/projects
topic/repo
topic/repo-migration
topic/security
topic/theme
topic/ui
topic/ui-interaction
topic/ux
topic/webhooks
topic/wiki
type/bug
type/deprecation
type/docs
type/enhancement
type/feature
type/miscellaneous
type/proposal
type/question
type/refactoring
type/summary
type/testing
type/upstream
Mirrored from GitHub Pull Request
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: github-starred/gitea#9774
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Originally created by @kolaente on GitHub (Nov 3, 2022).
Originally assigned to: @lunny on GitHub.
When pushing new docker images for an existing tag, the old image still exists and uses up storage one the server. While you can use images just by pointing to their sha, I've yet to find someone who actively uses that. For my own registry (portus) I have a cron job to automatically remove everything that does not have a tag pointing to it. Docker even has a command for this.
Having a cleanup job like that would allow to keep old versions but still solve the storage space problem.
@KN4CK3R in https://github.com/go-gitea/gitea/issues/21658#issuecomment-1301794468:
Gitlab has an automatic garbage collection process for this: https://docs.gitlab.com/ee/administration/packages/container_registry.html#removing-untagged-manifests-and-unreferenced-layers
I think it's best to discuss this before implementing, mostly regarding these open questions:
@KN4CK3R commented on GitHub (Nov 3, 2022):
Just for clarification, a repo has no impact on packages:
I checked again how I implemented this and currently there are no untagged images in the container registry! (Exception: If you upload a multiarch image, the different arches are untagged images) If you tag and push an image you can later pull that image with the tag and its hash. If a tag gets pushed again the old tag/version gets removed and that deletes the hash reference too. So after that operation there is no untagged image available anymore.
https://github.com/go-gitea/gitea/blob/f17edfaf5a31ea3f4e9152424b75c2c4986acbe3/routers/api/packages/container/manifest.go#L309-L312
So at the moment the cleanup does not need to remove untagged images because there are none. The question should first be "Should Gitea keep untagged version?"
@silverwind commented on GitHub (Nov 3, 2022):
Use case sounds pretty similar to
git gcwhich we already automatically run as a cron IIRC.If it's stable, I'd say so.
I think global is sufficient. Ideally it should just be another cron to cleanup orphaned images, like we already do for orphaned git commits via
git gc.@theodiem commented on GitHub (Jan 5, 2023):
I've came across this issue after experiencing the same effect.
Building multiarch images when only the manifest is tagged, left me with lots of "packages" behind with only the digest (the manifest had only one copy since it was tagged).
Tagging each arch so it gets overwritten makes the "details" tab a bit impractical when you have too much different arch and versions (for matrix builds).
In my case, I would be happy with the exact same global mechanism described (similar to the cron that runs
git gc)@salasrod commented on GitHub (Feb 3, 2023):
I am also looking for a similar feature, going out of my way to manually prune images is painful.
@lunny commented on GitHub (Feb 3, 2023):
Doesn't #21658 resolved the issue?
@kolaente commented on GitHub (Feb 3, 2023):
@lunny I didn't test it but I don't think so. The PR allows to configure rules for removal of tags, I just want to remove every image layer not associated with a tag.
@peiwenxu commented on GitHub (Sep 19, 2023):
Is this still happening?
@jum commented on GitHub (Sep 20, 2023):
No, I have 1.20.4 running and it does not happen.
Am 19. September 2023 14:06:27 MESZ schrieb Peiwen Xu @.***>:
@silverwind commented on GitHub (Sep 21, 2023):
No one has implemented this yet, but it's definitely a vital feature to conserve disk space.
Maybe it should be disabled by default to support pulling image by hash, which is a rare, but valid use case.
@c521wy commented on GitHub (Jan 27, 2024):
Does anyone tried this cleanup rule?
@kolaente commented on GitHub (Jan 30, 2024):
Using that and then checking with the preview yields no results, does not look like its working.
@kolaente commented on GitHub (Jan 30, 2024):
It looks like the official docker registry implementation uses this function to find and remove all untagged layers, as described here.
@KN4CK3R As far as I understood from glancing over the code, Gitea does not just "embed" the official registry package, so it's not as easy as just copying or calling that function?
@mhkarimi1383 commented on GitHub (Mar 27, 2024):
I'm facing the same issue with the latest version of gitea
@ViRb3 commented on GitHub (Jul 27, 2024):
The following seems to work perfectly! It deletes all images that do not have an associated tag with them. I would just suggest using
^sha256:.+instead, as you could otherwise match a tag that for some reason has sha256 in the middle.@KimonHoffmann commented on GitHub (Sep 5, 2024):
Be careful with this approach, when using multi platform images!
In this case the individual platform images might be untagged, but the images themselves may still be referenced (by the multi platform manifest that is). I'm currently trying to deal with this problem myself and have not yet found a way that does not require deeper insight into the relationships of the images involved.
If someone has something to suggest that'd be very welcome!
@gjung56 commented on GitHub (Sep 5, 2024):
Yes, the cleanup rule delete platform variants images.
Until we can find a integrated solution, I ended up with an external cronjob that prune old images in my self-hosted instance.
I fetched the registry api and used the gitea golang sdk, in a hacky way but It's working.
gitea_registry_prune.go.txt
@stuzer05 commented on GitHub (Dec 12, 2024):
Thank you, that works perfectly as needed!
@lunny will there be a solution to cleanup orphan registry images? Space grows on server so this manual hack is the only way cleanup space.
@lunny commented on GitHub (Dec 13, 2024):
I don't think so. I will take a look at this problem.
@stuzer05 commented on GitHub (Dec 13, 2024):
Orphan images occur when pushing with the same label (e.g. latest) to container registry. Those "behind" images are the problem
@philkunz commented on GitHub (Feb 7, 2025):
Any updates on this one? We just ran into this problem, pushing a lot of latest images for internal build tools on our code.foss.global instance.
@stuzer05 commented on GitHub (Feb 7, 2025):
Try this for now https://gitea.stuzer.link/stuzer05/gitea-docker-registry-prune