From 02fd6c48eeab93748fdfc79cfe7471f1da77504d Mon Sep 17 00:00:00 2001 From: Avi Deitcher Date: Tue, 7 Jun 2022 10:45:29 +0300 Subject: [PATCH] do not push if the tag and digest are identical Signed-off-by: Avi Deitcher --- src/cmd/linuxkit/cache/push.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/cmd/linuxkit/cache/push.go b/src/cmd/linuxkit/cache/push.go index aeaca0de5..c00c863ea 100644 --- a/src/cmd/linuxkit/cache/push.go +++ b/src/cmd/linuxkit/cache/push.go @@ -29,16 +29,38 @@ func (p *Provider) Push(name string) error { return err } options = append(options, remote.WithAuthFromKeychain(authn.DefaultKeychain)) + img, err1 := root.Image() ii, err2 := root.ImageIndex() + // before we even try to push, let us see if it exists remotely + remoteOptions := []remote.Option{remote.WithAuthFromKeychain(authn.DefaultKeychain)} + switch { case err1 == nil: + dig, err := img.Digest() + if err != nil { + return fmt.Errorf("could not get digest for image %s: %v", name, err) + } + desc, err := remote.Get(ref, remoteOptions...) + if err == nil && desc != nil && dig == desc.Digest { + fmt.Printf("%s image already available on remote registry, skipping push", name) + return nil + } log.Debugf("pushing image %s", name) if err := remote.Write(ref, img, options...); err != nil { return err } fmt.Printf("Pushed image %s\n", name) case err2 == nil: + dig, err := ii.Digest() + if err != nil { + return fmt.Errorf("could not get digest for index %s: %v", name, err) + } + desc, err := remote.Get(ref, remoteOptions...) + if err == nil && desc != nil && dig == desc.Digest { + fmt.Printf("%s index already available on remote registry, skipping push", name) + return nil + } log.Debugf("pushing index %s", name) // this is an index, so we not only want to write the index, but tags for each arch-specific image in it if err := remote.WriteIndex(ref, ii, options...); err != nil {