Merge pull request #1264 from greut/fix/1172

pkg: prepend library when using registry mirror
This commit is contained in:
Tejal Desai 2020-07-28 14:55:36 -07:00 committed by GitHub
commit 46f270bbd4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 41 additions and 0 deletions

View File

@ -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)

View File

@ -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)))