1
0
Fork 0
mirror of https://github.com/imjasonh/kontain.me synced 2026-07-08 00:55:14 +00:00

flatten images concurrently

This commit is contained in:
Jason Hall 2020-12-21 12:17:45 -05:00
parent e02f0a0d54
commit 197dd2d0f5

View file

@ -23,13 +23,13 @@ import (
"strings"
"github.com/google/go-containerregistry/pkg/name"
v1 "github.com/google/go-containerregistry/pkg/v1"
"github.com/google/go-containerregistry/pkg/v1/empty"
"github.com/google/go-containerregistry/pkg/v1/mutate"
"github.com/google/go-containerregistry/pkg/v1/remote"
"github.com/google/go-containerregistry/pkg/v1/tarball"
"github.com/google/go-containerregistry/pkg/v1/types"
"github.com/imjasonh/kontain.me/pkg/serve"
"golang.org/x/sync/errgroup"
)
func main() {
@ -126,31 +126,38 @@ func (s *server) serveFlattenManifest(w http.ResponseWriter, r *http.Request) {
return
}
// Flatten each image in the manifest.
var fidx v1.ImageIndex = empty.Index
for _, m := range im.Manifests {
img, err := idx.Image(m.Digest)
if err != nil {
s.error.Printf("ERROR (idx.Image): %v", err)
serve.Error(w, err)
return
}
l, err := tarball.LayerFromOpener(func() (io.ReadCloser, error) { return mutate.Extract(img), nil })
if err != nil {
s.error.Printf("ERROR (tarball.LayerFromOpener): %v", err)
serve.Error(w, err)
return
}
fimg, err := mutate.AppendLayers(empty.Image, l)
if err != nil {
s.error.Printf("ERROR (mutate.AppendLayers): %v", err)
serve.Error(w, err)
return
}
fidx = mutate.AppendManifests(fidx, mutate.IndexAddendum{
Add: fimg,
Descriptor: m,
var g errgroup.Group
adds := make([]mutate.IndexAddendum, len(im.Manifests))
for i, m := range im.Manifests {
i, m := i, m
g.Go(func() error {
img, err := idx.Image(m.Digest)
if err != nil {
s.error.Printf("ERROR (idx.Image): %v", err)
return err
}
l, err := tarball.LayerFromOpener(func() (io.ReadCloser, error) { return mutate.Extract(img), nil })
if err != nil {
s.error.Printf("ERROR (tarball.LayerFromOpener): %v", err)
return err
}
fimg, err := mutate.AppendLayers(empty.Image, l)
if err != nil {
s.error.Printf("ERROR (mutate.AppendLayers): %v", err)
return err
}
adds[i] = mutate.IndexAddendum{
Add: fimg,
Descriptor: m,
}
return nil
})
}
if err := g.Wait(); err != nil {
serve.Error(w, err)
return
}
fidx := mutate.AppendManifests(empty.Index, adds...)
if err := serve.Index(w, r, fidx); err != nil {
s.error.Printf("ERROR (serve.Index): %v", err)
serve.Error(w, err)