We updated our private docker registry to the official Registry 2.0. This version can now delete docker images identified by a hashtag (see https://docs.docker.com/registry/
There is some discussion happening to design this - right now, there is no layer cleanup tool / endpoint.
I would encourage you to go to:
and/or reach out on Freenode IRC on #docker-distribution for more.
Deletion of images (you can keep 10 last versions, like I do in my CI) is done in three steps:
Enable image deletion by setting environment variable REGISTRY_STORAGE_DELETE_ENABLED: "true"
and passing it to docker-registry
Run below script (it will delete all images and tags but keep last 10 versions)
registry.py -l user:pass -r https://example.com:5000 --delete --num 10
Run garbage collection (you can put it into your daily cron task)
docker-compose -f [path_to_your_docker_compose_file] run registry bin/registry garbage-collect /etc/docker/registry/config.yml
registry.py can be downloaded from the link below, it also allows listing images, tags and layers, as well as deleting a particular image and/or tag.
https://github.com/andrey-pohilko/registry-cli
Before garbage collection my registry folder was 7 Gb, after I ran the above steps it deflated down to 1 Gb.
For removing unsed images, three steps manually on these sequence:
docker rmi -f **imageid**
rm -Rf /home/**homedirectory**/docker-registry/data/docker/registry/v2/repositories/**yoursystemname**/**yourimagename**/_manifests/tags/**image version**/
docker exec $(docker ps -q) bin/registry garbage-collect /etc/docker/registry/config.yml -m
*Pay attention:
** You must execute those commands (above) in test environment, because if you commit any mistake or didn't understand any step, you don't damage your production environment.
** You can schedule those commands (above) using crontab as root. In the step 3) you must execute removing "-it", as result: docker exec $(docker ps -q) bin/registry garbage-collect /etc/docker/registry/config.yml -m`.
It works for me for more than 6 months.
Regarding your question:
I would need a method to delete all images from the private registry which are no longer identified by a named tag
A new version of the docker registry in distribution/registry:master has this nice feature! However, you won't be able to trigger it from the API.
Anyway, you will be able to clean all untagged manifests in your registry, meaning that every overwritten tag won't leave old manifests and blobs in the registry. Every "unused" layer will be cleaned by the Registry Garbage Collectior.
You just have to run a docker exec
:
docker exec ${container_id} registry garbage-collect \
/path/to/your/registry/config.yml \
--delete-untagged=true
Looking at this garbage-collect binary help:
Usage:
registry garbage-collect <config> [flags]
Flags:
-m, --delete-untagged=false: delete manifests that are not currently referenced via tag
-d, --dry-run=false: do everything except remove the blobs
-h, --help=false: help for garbage-collect
You can have a look at the github PR. It's been merged and usable with distribution/registry
, tag master
as of 2018-02-23. It supersedes the docker/docker-registry
project with a new API design, focused around security and performance...
I did use this feature today and recovered 89% of registry space (5.7 GB vs. 55 GB). Then I switched back to stable registry.
I host regestry in docker container with name docker-registry_registry_1
from image: registry:2
I just run garbage-collect
with -m
docker exec docker-registry_registry_1 bin/registry garbage-collect /etc/docker/registry/config.yml -m
I pieced together various parts of this thread and created an easy to use cleanup script in bash You can check it out in this gist cleanup.sh