diff --git a/pkg/image/image_util.go b/pkg/image/image_util.go index fb7a7ce891..44f2f399f4 100644 --- a/pkg/image/image_util.go +++ b/pkg/image/image_util.go @@ -21,6 +21,7 @@ import ( "path/filepath" "runtime" "strconv" + "strings" "github.com/GoogleContainerTools/kaniko/pkg/cache" "github.com/GoogleContainerTools/kaniko/pkg/config" @@ -117,6 +118,11 @@ func remoteImage(image string, opts *config.KanikoOptions) (v1.Image, error) { return nil, err } + ref, err = normalizeReference(ref, image) + if err != nil { + return nil, err + } + toSet = true } @@ -134,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 3b9e039cfe..4a99d4ef11 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)))