From fef4bb55b7b5b3b2e660c4565d13ee84bc9e0ac4 Mon Sep 17 00:00:00 2001 From: Yoan Blanc Date: Tue, 12 May 2020 14:46:25 +0200 Subject: [PATCH 1/2] image: prepend library/ when using registry Signed-off-by: Yoan Blanc --- pkg/util/image_util.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pkg/util/image_util.go b/pkg/util/image_util.go index 9f1e68e51..f241210f9 100644 --- a/pkg/util/image_util.go +++ b/pkg/util/image_util.go @@ -22,6 +22,7 @@ import ( "net/http" "path/filepath" "strconv" + "strings" "github.com/GoogleContainerTools/kaniko/pkg/timing" @@ -118,6 +119,13 @@ func remoteImage(image string, opts *config.KanikoOptions) (v1.Image, error) { return nil, err } + if !strings.ContainsRune(image, '/') { + ref, err = name.ParseReference("library/"+image, name.WeakValidation) + if err != nil { + return nil, err + } + } + toSet = true } From ce8298bb14ac420324de96bf55194285023d98d6 Mon Sep 17 00:00:00 2001 From: Yoan Blanc Date: Sat, 6 Jun 2020 10:31:42 +0200 Subject: [PATCH 2/2] image: add test Signed-off-by: Yoan Blanc --- pkg/image/image_util.go | 23 ++++++++++++++++++----- pkg/image/image_util_test.go | 20 ++++++++++++++++++++ 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/pkg/image/image_util.go b/pkg/image/image_util.go index c4e044235..44f2f399f 100644 --- a/pkg/image/image_util.go +++ b/pkg/image/image_util.go @@ -118,11 +118,9 @@ func remoteImage(image string, opts *config.KanikoOptions) (v1.Image, error) { return nil, err } - if !strings.ContainsRune(image, '/') { - ref, err = name.ParseReference("library/"+image, name.WeakValidation) - if err != nil { - return nil, err - } + ref, err = normalizeReference(ref, image) + if err != nil { + return nil, err } toSet = true @@ -142,16 +140,31 @@ func remoteImage(image string, opts *config.KanikoOptions) (v1.Image, error) { tag.Repository.Registry = newReg ref = tag } + if digest, ok := ref.(name.Digest); ok { digest.Repository.Registry = newReg ref = digest } } + logrus.Infof("Retrieving image %s", ref) + rOpts := remoteOptions(registryName, opts) return remote.Image(ref, rOpts...) } +// normalizeReference adds the library/ prefix to images without it. +// +// It is mostly useful when using a registry mirror that is not able to perform +// this fix automatically. +func normalizeReference(ref name.Reference, image string) (name.Reference, error) { + if !strings.ContainsRune(image, '/') { + return name.ParseReference("library/"+image, name.WeakValidation) + } + + return ref, nil +} + func remoteOptions(registryName string, opts *config.KanikoOptions) []remote.Option { tr := util.MakeTransport(opts, registryName) diff --git a/pkg/image/image_util_test.go b/pkg/image/image_util_test.go index 3b9e039cf..4a99d4ef1 100644 --- a/pkg/image/image_util_test.go +++ b/pkg/image/image_util_test.go @@ -20,6 +20,7 @@ import ( "bytes" "testing" + "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/moby/buildkit/frontend/dockerfile/instructions" @@ -109,6 +110,25 @@ func Test_ScratchImageFromMirror(t *testing.T) { testutil.CheckErrorAndDeepEqual(t, false, err, expected, actual) } +func Test_normalizeReference(t *testing.T) { + image := "debian" + expected := "index.docker.io/library/debian:latest" + + ref, err := name.ParseReference(image) + if err != nil { + t.Fatal(err) + } + + ref2, err := normalizeReference(ref, image) + if err != nil { + t.Fatal(err) + } + + if ref2.Name() != ref.Name() || ref2.Name() != expected { + t.Errorf("%s should have been normalized to %s, got %s", ref2.Name(), expected, ref.Name()) + } +} + // parse parses the contents of a Dockerfile and returns a list of commands func parse(s string) ([]instructions.Stage, error) { p, err := parser.Parse(bytes.NewReader([]byte(s)))