diff --git a/cmd/flatten/main.go b/cmd/flatten/main.go index e72887a..38052f8 100644 --- a/cmd/flatten/main.go +++ b/cmd/flatten/main.go @@ -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)