always use canonical names in the linuxkit cache

Signed-off-by: Avi Deitcher <avi@deitcher.net>
This commit is contained in:
Avi Deitcher 2021-04-30 14:57:22 +03:00
parent a8797a5e0f
commit 9bb26e4c3a
6 changed files with 34 additions and 26 deletions

View File

@ -85,7 +85,7 @@ func OutputTypes() []string {
func outputImage(image *Image, section string, prefix string, m Moby, idMap map[string]uint32, dupMap map[string]string, pull bool, iw *tar.Writer, cacheDir string, dockerCache bool) error {
log.Infof(" Create OCI config for %s", image.Image)
imageName := referenceExpand(image.Image)
imageName := util.ReferenceExpand(image.Image)
ref, err := reference.Parse(imageName)
if err != nil {
return fmt.Errorf("could not resolve references for image %s: %v", image.Image, err)

View File

@ -7,6 +7,7 @@ import (
"strings"
"github.com/containerd/containerd/reference"
"github.com/linuxkit/linuxkit/src/cmd/linuxkit/util"
imagespec "github.com/opencontainers/image-spec/specs-go/v1"
"github.com/opencontainers/runtime-spec/specs-go"
log "github.com/sirupsen/logrus"
@ -163,50 +164,37 @@ func uniqueServices(m Moby) error {
return nil
}
// referenceExpand expands "redis" to "docker.io/library/redis" so all images have a full domain
func referenceExpand(ref string) string {
parts := strings.Split(ref, "/")
switch len(parts) {
case 1:
return "docker.io/library/" + ref
case 2:
return "docker.io/" + ref
default:
return ref
}
}
func extractReferences(m *Moby) error {
if m.Kernel.Image != "" {
r, err := reference.Parse(referenceExpand(m.Kernel.Image))
r, err := reference.Parse(util.ReferenceExpand(m.Kernel.Image))
if err != nil {
return fmt.Errorf("extract kernel image reference: %v", err)
}
m.Kernel.ref = &r
}
for _, ii := range m.Init {
r, err := reference.Parse(referenceExpand(ii))
r, err := reference.Parse(util.ReferenceExpand(ii))
if err != nil {
return fmt.Errorf("extract init image reference: %v", err)
}
m.initRefs = append(m.initRefs, &r)
}
for _, image := range m.Onboot {
r, err := reference.Parse(referenceExpand(image.Image))
r, err := reference.Parse(util.ReferenceExpand(image.Image))
if err != nil {
return fmt.Errorf("extract on boot image reference: %v", err)
}
image.ref = &r
}
for _, image := range m.Onshutdown {
r, err := reference.Parse(referenceExpand(image.Image))
r, err := reference.Parse(util.ReferenceExpand(image.Image))
if err != nil {
return fmt.Errorf("extract on shutdown image reference: %v", err)
}
image.ref = &r
}
for _, image := range m.Services {
r, err := reference.Parse(referenceExpand(image.Image))
r, err := reference.Parse(util.ReferenceExpand(image.Image))
if err != nil {
return fmt.Errorf("extract service image reference: %v", err)
}

View File

@ -163,7 +163,7 @@ func (p Pkg) Build(bos ...BuildOpt) error {
}
arch := runtime.GOARCH
ref, err := reference.Parse(p.Tag())
ref, err := reference.Parse(p.FullTag())
if err != nil {
return fmt.Errorf("could not resolve references for image %s: %v", p.Tag(), err)
}
@ -295,7 +295,7 @@ func (p Pkg) Build(bos ...BuildOpt) error {
}
// get descriptor for root of manifest
desc, err := c.FindDescriptor(p.Tag())
desc, err := c.FindDescriptor(p.FullTag())
if err != nil {
return err
}
@ -322,7 +322,7 @@ func (p Pkg) Build(bos ...BuildOpt) error {
}
// push the manifest
if err := c.Push(p.Tag()); err != nil {
if err := c.Push(p.FullTag()); err != nil {
return err
}
@ -349,7 +349,7 @@ func (p Pkg) Build(bos ...BuildOpt) error {
// tag in docker, if requested
if bo.targetDocker {
if err := d.tag(p.Tag(), relTag); err != nil {
if err := d.tag(p.FullTag(), relTag); err != nil {
return err
}
}
@ -375,7 +375,7 @@ func (p Pkg) buildArch(d dockerRunner, c lktspec.CacheProvider, arch string, arg
fmt.Fprintf(writer, "Building for arch %s as %s\n", arch, tagArch)
if !bo.force {
ref, err := reference.Parse(p.Tag())
ref, err := reference.Parse(p.FullTag())
if err != nil {
return nil, fmt.Errorf("could not resolve references for image %s: %v", p.Tag(), err)
}
@ -410,7 +410,7 @@ func (p Pkg) buildArch(d dockerRunner, c lktspec.CacheProvider, arch string, arg
}
}
)
ref, err := reference.Parse(tag)
ref, err := reference.Parse(p.FullTag())
if err != nil {
return nil, fmt.Errorf("could not resolve references for image %s: %v", tagArch, err)
}

View File

@ -298,7 +298,6 @@ func TestBuild(t *testing.T) {
cache *cacheMocker
err string
}{
{"missing tag", Pkg{}, nil, nil, &dockerMocker{}, &cacheMocker{}, "could not resolve references"},
{"invalid tag", Pkg{image: "docker.io/foo/bar:abc:def:ghi"}, nil, nil, &dockerMocker{}, &cacheMocker{}, "could not resolve references"},
{"mismatched platforms", Pkg{org: "foo", image: "bar", hash: "abc", arches: []string{"arm64"}}, nil, []string{"amd64"}, nil, nil, fmt.Sprintf("arch %s not supported", "amd64")},
{"not at head", Pkg{org: "foo", image: "bar", hash: "abc", arches: []string{"amd64"}, commitHash: "foo"}, nil, []string{"amd64"}, &dockerMocker{supportBuildKit: false}, &cacheMocker{}, "Cannot build from commit hash != HEAD"},

View File

@ -13,6 +13,7 @@ import (
"gopkg.in/yaml.v2"
"github.com/linuxkit/linuxkit/src/cmd/linuxkit/moby"
"github.com/linuxkit/linuxkit/src/cmd/linuxkit/util"
)
// Contains fields settable in the build.yml
@ -276,6 +277,10 @@ func (p Pkg) Tag() string {
return p.org + "/" + p.image + ":" + t
}
func (p Pkg) FullTag() string {
return util.ReferenceExpand(p.Tag())
}
// TrustEnabled returns true if trust is enabled
func (p Pkg) TrustEnabled() bool {
return p.trust

View File

@ -0,0 +1,16 @@
package util
import "strings"
// ReferenceExpand expands "redis" to "docker.io/library/redis" so all images have a full domain
func ReferenceExpand(ref string) string {
parts := strings.Split(ref, "/")
switch len(parts) {
case 1:
return "docker.io/library/" + ref
case 2:
return "docker.io/" + ref
default:
return ref
}
}