1
0
Fork 0
mirror of https://github.com/imjasonh/kontain.me synced 2026-07-22 15:51:12 +00:00

mirror images and indexes

This commit is contained in:
Jason Hall 2020-09-18 16:06:59 -04:00
parent 989ebe612d
commit c6c35c3531

View file

@ -23,6 +23,7 @@ import (
"github.com/google/go-containerregistry/pkg/name"
"github.com/google/go-containerregistry/pkg/v1/remote"
"github.com/google/go-containerregistry/pkg/v1/types"
"github.com/imjasonh/kontain.me/pkg/serve"
)
@ -91,19 +92,40 @@ func (s *server) serveMirrorManifest(w http.ResponseWriter, r *http.Request) {
}
if err := serve.BlobExists(d.Digest); err != nil {
s.info.Printf("INFO (serve.BlobExists(%q)): %v", d, err)
// Blob doesn't exist yet. Try to get the image manifest+layers
// and cache them.
idx, err := remote.Index(ref)
if err != nil {
s.error.Printf("ERROR (remote.Index): %v", err)
serve.Error(w, err)
return
}
if err := serve.Index(w, r, idx); err != nil {
s.error.Printf("ERROR (serve.Index): %v", err)
serve.Error(w, err)
return
switch d.MediaType {
case types.DockerManifestList:
// If the image is a manifest list, fetch and mirror
// the image index.
idx, err := remote.Index(ref)
if err != nil {
s.error.Printf("ERROR (remote.Index): %v", err)
serve.Error(w, err)
return
}
if err := serve.Index(w, r, idx); err != nil {
s.error.Printf("ERROR (serve.Index): %v", err)
serve.Error(w, err)
return
}
case types.DockerManifestSchema2:
// If it's a simple image, fetch and mirror its
// manifest.
img, err := remote.Image(ref)
if err != nil {
s.error.Printf("ERROR (remote.Image): %v", err)
serve.Error(w, err)
return
}
if err := serve.Manifest(w, r, img); err != nil {
s.error.Printf("ERROR (serve.Index): %v", err)
serve.Error(w, err)
return
}
}
} else {
serve.Blob(w, r, d.Digest.String())
}