christoph ender's

blog

wednesday the 27th of march, 2024

removal from private docker registry

It seems there's no easy way to remove tags / images from a private docker registry. It appears the most straightforward way is to get the manifest digest and to put it into a HTTP delete request.

rm-docker-img-tag.sh
#!/bin/bash

if [[ $# -lt 3 || $# -gt 4 ]]; then
  echo "Syntax: ${0} <registry-url> <name> <tag> [auth-name:auth-password]"
  exit 1
fi

REGISTRY=${1}
NAME=${2}
TAG=${3}
if [[ $# -eq 4 ]]; then AUTH_PARAMS="-u ${4}"; fi

DIGEST=$(
 curl \
  --silent \
  --head \
  -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
  -o /dev/null \
  -w '%header{Docker-Content-Digest}' \
  ${AUTH_PARAMS} \
  "https://${REGISTRY}/v2/${NAME}/manifests/${TAG}")

curl \
  -X DELETE \
  ${AUTH_PARAMS} \
  --silent \
  --head \
  "https://${REGISTRY}/v2/${NAME}/manifests/${DIGEST}"

Before being able to delete anything, the registry's environment has to contain the following setting:

REGISTRY_STORAGE_DELETE_ENABLED=true

Once the script has been successfully run it's necessary to manually initiate the registry's garbage collection:

docker exec -it my-registry \
  bin/registry garbage-collect /etc/docker/registry/config.yml