Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@velp
Last active April 3, 2020 13:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save velp/36cd758f01456a1c0eacf41edac4ea70 to your computer and use it in GitHub Desktop.
Save velp/36cd758f01456a1c0eacf41edac4ea70 to your computer and use it in GitHub Desktop.
DigitalOcean Golang remove docker image from docker registry

Check the image exists:

docker pull registry.runme.io/runme-50b2af51-f401-43fe-aaec-808868b7e3a0:latest
latest: Pulling from runme-50b2af51-f401-43fe-aaec-808868b7e3a0
092586df9206: Already exists
ef599477fae0: Already exists
4530c6472b5d: Already exists
d34d61487075: Already exists
87fc2710b63f: Already exists
e83c771c5387: Already exists
c28bd271641e: Already exists
5137e6957710: Already exists
1d8bcbc41a69: Already exists
3d45045f5e5b: Extracting [==================================================>]     156B/156B
0eb4cf560de4: Download complete
74b8a560ad82: Downloading [=>                                                 ]  25.34kB/1.195MB
503c898d97d7: Waiting
^C

Code sample:

package main

import (
	"os"
	"strings"

	"github.com/sirupsen/logrus"
	"github.com/velp/docker-registry-client/registry"
)

const (
	registryFullURL = "https://registry.runme.io/v2/"
	image           = "runme-50b2af51-f401-43fe-aaec-808868b7e3a0"
)

func main() {
	logger := &logrus.Logger{
		Hooks:     make(logrus.LevelHooks),
		Out:       os.Stdout,
		Formatter: new(logrus.TextFormatter),
	}
	logger.Level = logrus.DebugLevel
	// Remove /v2 in the end of registry URL
	registryURL := registryFullURL
	pos := strings.Index(registryURL, "/v2")
	if pos > -1 {
		registryURL = registryURL[:pos]
	}
	// Create registry client
	hub, err := registry.New(registryURL, "", "")
	if err != nil {
		logger.Fatalf("registry failed: %s", err)
	}
	// Set registry logger
	hub.Logf = logger.Infof
	// Get list of tags for the image
	tags, err := hub.Tags(image)
	if err != nil {
		logger.Fatalf("tags failed: %s", err)
	}
	for _, tag := range tags {
		// Get list of layers from manifest
		manifest, err := hub.ManifestV2(image, tag)
		if err != nil {
			logger.Fatalf("get manifest failed: %s", err)
		}
		// Remove each layer for the tag
		for _, layer := range manifest.Layers {
			err := hub.DeleteBlob(image, layer.Digest)
			if err != nil {
				logger.Fatalf("delete blob failed: %s", err)
			}
		}
		// Remove tag for the image
		digest, err := hub.ManifestDigestV2(image, tag)
		if err != nil {
			logger.Fatalf("get manifest digest failed: %s", err)
		}
		err = hub.DeleteManifest(image, digest)
		if err != nil {
			logger.Fatalf("delete manifest failed: %s", err)
		}
	}
}

Result:

2020/03/07 21:55:05 registry.ping url=https://registry.runme.io/v2/
INFO[0000] registry.tags url=https://registry.runme.io/v2/runme-50b2af51-f401-43fe-aaec-808868b7e3a0/tags/list repository=runme-50b2af51-f401-43fe-aaec-808868b7e3a0
INFO[0000] registry.manifest.get url=https://registry.runme.io/v2/runme-50b2af51-f401-43fe-aaec-808868b7e3a0/manifests/latest repository=runme-50b2af51-f401-43fe-aaec-808868b7e3a0 reference=latest
INFO[0000] registry.blob.delete url=https://registry.runme.io/v2/runme-50b2af51-f401-43fe-aaec-808868b7e3a0/blobs/sha256:092586df92068bd6b59c497f379e48302aa1b27cf76b2de64d262ba7bc19e47b repository=runme-50b2af51-f401-43fe-aaec-808868b7e3a0 digest=sha256:092586df92068bd6b59c497f379e48302aa1b27cf76b2de64d262ba7bc19e47b
INFO[0001] registry.blob.delete url=https://registry.runme.io/v2/runme-50b2af51-f401-43fe-aaec-808868b7e3a0/blobs/sha256:ef599477fae0e7485cae7d038240cda6358b3af22c7eb4ea502c60771b68dcae repository=runme-50b2af51-f401-43fe-aaec-808868b7e3a0 digest=sha256:ef599477fae0e7485cae7d038240cda6358b3af22c7eb4ea502c60771b68dcae
INFO[0001] registry.blob.delete url=https://registry.runme.io/v2/runme-50b2af51-f401-43fe-aaec-808868b7e3a0/blobs/sha256:4530c6472b5d2a08201c9cd65f43a788e526eb4fe498a4fbe5e4d5688535cd21 repository=runme-50b2af51-f401-43fe-aaec-808868b7e3a0 digest=sha256:4530c6472b5d2a08201c9cd65f43a788e526eb4fe498a4fbe5e4d5688535cd21
INFO[0001] registry.blob.delete url=https://registry.runme.io/v2/runme-50b2af51-f401-43fe-aaec-808868b7e3a0/blobs/sha256:d34d61487075d127bf6dd2906ea3abc50e0a3cd9aa2f230fc41b253b153a17ee repository=runme-50b2af51-f401-43fe-aaec-808868b7e3a0 digest=sha256:d34d61487075d127bf6dd2906ea3abc50e0a3cd9aa2f230fc41b253b153a17ee
INFO[0001] registry.blob.delete url=https://registry.runme.io/v2/runme-50b2af51-f401-43fe-aaec-808868b7e3a0/blobs/sha256:87fc2710b63fcf6c0a5c876b1b37773d9e949cb4d66eeb06889ef84f7b5a5a93 repository=runme-50b2af51-f401-43fe-aaec-808868b7e3a0 digest=sha256:87fc2710b63fcf6c0a5c876b1b37773d9e949cb4d66eeb06889ef84f7b5a5a93
INFO[0001] registry.blob.delete url=https://registry.runme.io/v2/runme-50b2af51-f401-43fe-aaec-808868b7e3a0/blobs/sha256:e83c771c5387a93b121fdd5ff15d311f4b2426629857e685841e82fa4b054fab repository=runme-50b2af51-f401-43fe-aaec-808868b7e3a0 digest=sha256:e83c771c5387a93b121fdd5ff15d311f4b2426629857e685841e82fa4b054fab
INFO[0002] registry.blob.delete url=https://registry.runme.io/v2/runme-50b2af51-f401-43fe-aaec-808868b7e3a0/blobs/sha256:c28bd271641eda8399e2728a0443168efec665d6570335d7fd436e89aac758d7 repository=runme-50b2af51-f401-43fe-aaec-808868b7e3a0 digest=sha256:c28bd271641eda8399e2728a0443168efec665d6570335d7fd436e89aac758d7
INFO[0002] registry.blob.delete url=https://registry.runme.io/v2/runme-50b2af51-f401-43fe-aaec-808868b7e3a0/blobs/sha256:5137e695771060efc647c706bd2a392d661fc38376a3fe5b60faf59959c418b2 repository=runme-50b2af51-f401-43fe-aaec-808868b7e3a0 digest=sha256:5137e695771060efc647c706bd2a392d661fc38376a3fe5b60faf59959c418b2
INFO[0002] registry.blob.delete url=https://registry.runme.io/v2/runme-50b2af51-f401-43fe-aaec-808868b7e3a0/blobs/sha256:1d8bcbc41a69aa7e29758bf24b61408cc357637b45b01958a64f3ce5759c5af8 repository=runme-50b2af51-f401-43fe-aaec-808868b7e3a0 digest=sha256:1d8bcbc41a69aa7e29758bf24b61408cc357637b45b01958a64f3ce5759c5af8
INFO[0002] registry.blob.delete url=https://registry.runme.io/v2/runme-50b2af51-f401-43fe-aaec-808868b7e3a0/blobs/sha256:3d45045f5e5b4d0e9fd670cfc5f3738956c3f28ba5845cce47b00cfd240a9d92 repository=runme-50b2af51-f401-43fe-aaec-808868b7e3a0 digest=sha256:3d45045f5e5b4d0e9fd670cfc5f3738956c3f28ba5845cce47b00cfd240a9d92
INFO[0003] registry.blob.delete url=https://registry.runme.io/v2/runme-50b2af51-f401-43fe-aaec-808868b7e3a0/blobs/sha256:0eb4cf560de44b4784fdf73c5a02cef447195d76d9b18d2e1cf01db473f8d350 repository=runme-50b2af51-f401-43fe-aaec-808868b7e3a0 digest=sha256:0eb4cf560de44b4784fdf73c5a02cef447195d76d9b18d2e1cf01db473f8d350
INFO[0003] registry.blob.delete url=https://registry.runme.io/v2/runme-50b2af51-f401-43fe-aaec-808868b7e3a0/blobs/sha256:74b8a560ad8293c7c5aa7ee8be239e04a89d885950d74c367f2252b04077bfd8 repository=runme-50b2af51-f401-43fe-aaec-808868b7e3a0 digest=sha256:74b8a560ad8293c7c5aa7ee8be239e04a89d885950d74c367f2252b04077bfd8
INFO[0003] registry.blob.delete url=https://registry.runme.io/v2/runme-50b2af51-f401-43fe-aaec-808868b7e3a0/blobs/sha256:503c898d97d71ce2bf040fc2b517263d33c7e716dab0c8a87222ab0272c44790 repository=runme-50b2af51-f401-43fe-aaec-808868b7e3a0 digest=sha256:503c898d97d71ce2bf040fc2b517263d33c7e716dab0c8a87222ab0272c44790
INFO[0003] registry.manifest.head url=https://registry.runme.io/v2/runme-50b2af51-f401-43fe-aaec-808868b7e3a0/manifests/latest repository=runme-50b2af51-f401-43fe-aaec-808868b7e3a0 reference=latest
INFO[0003] registry.manifest.delete url=https://registry.runme.io/v2/runme-50b2af51-f401-43fe-aaec-808868b7e3a0/manifests/sha256:20484f84e736d54143bd9d88de9c79e070b6706ffb6d857a6bda24dbaef7446a repository=runme-50b2af51-f401-43fe-aaec-808868b7e3a0 reference=sha256:20484f84e736d54143bd9d88de9c79e070b6706ffb6d857a6bda24dbaef7446a

After:

docker pull registry.runme.io/runme-50b2af51-f401-43fe-aaec-808868b7e3a0:latest
Error response from daemon: manifest for registry.runme.io/runme-50b2af51-f401-43fe-aaec-808868b7e3a0:latest not found: manifest unknown: manifest unknown

But image still in DigitalOcean: Screenshot 2020-03-07 at 21 58 12

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment