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 { 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) log.Infof(" Create OCI config for %s", image.Image)
imageName := referenceExpand(image.Image) imageName := util.ReferenceExpand(image.Image)
ref, err := reference.Parse(imageName) ref, err := reference.Parse(imageName)
if err != nil { if err != nil {
return fmt.Errorf("could not resolve references for image %s: %v", image.Image, err) return fmt.Errorf("could not resolve references for image %s: %v", image.Image, err)

View File

@ -7,6 +7,7 @@ import (
"strings" "strings"
"github.com/containerd/containerd/reference" "github.com/containerd/containerd/reference"
"github.com/linuxkit/linuxkit/src/cmd/linuxkit/util"
imagespec "github.com/opencontainers/image-spec/specs-go/v1" imagespec "github.com/opencontainers/image-spec/specs-go/v1"
"github.com/opencontainers/runtime-spec/specs-go" "github.com/opencontainers/runtime-spec/specs-go"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
@ -163,50 +164,37 @@ func uniqueServices(m Moby) error {
return nil 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 { func extractReferences(m *Moby) error {
if m.Kernel.Image != "" { if m.Kernel.Image != "" {
r, err := reference.Parse(referenceExpand(m.Kernel.Image)) r, err := reference.Parse(util.ReferenceExpand(m.Kernel.Image))
if err != nil { if err != nil {
return fmt.Errorf("extract kernel image reference: %v", err) return fmt.Errorf("extract kernel image reference: %v", err)
} }
m.Kernel.ref = &r m.Kernel.ref = &r
} }
for _, ii := range m.Init { for _, ii := range m.Init {
r, err := reference.Parse(referenceExpand(ii)) r, err := reference.Parse(util.ReferenceExpand(ii))
if err != nil { if err != nil {
return fmt.Errorf("extract init image reference: %v", err) return fmt.Errorf("extract init image reference: %v", err)
} }
m.initRefs = append(m.initRefs, &r) m.initRefs = append(m.initRefs, &r)
} }
for _, image := range m.Onboot { for _, image := range m.Onboot {
r, err := reference.Parse(referenceExpand(image.Image)) r, err := reference.Parse(util.ReferenceExpand(image.Image))
if err != nil { if err != nil {
return fmt.Errorf("extract on boot image reference: %v", err) return fmt.Errorf("extract on boot image reference: %v", err)
} }
image.ref = &r image.ref = &r
} }
for _, image := range m.Onshutdown { for _, image := range m.Onshutdown {
r, err := reference.Parse(referenceExpand(image.Image)) r, err := reference.Parse(util.ReferenceExpand(image.Image))
if err != nil { if err != nil {
return fmt.Errorf("extract on shutdown image reference: %v", err) return fmt.Errorf("extract on shutdown image reference: %v", err)
} }
image.ref = &r image.ref = &r
} }
for _, image := range m.Services { for _, image := range m.Services {
r, err := reference.Parse(referenceExpand(image.Image)) r, err := reference.Parse(util.ReferenceExpand(image.Image))
if err != nil { if err != nil {
return fmt.Errorf("extract service image reference: %v", err) 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 arch := runtime.GOARCH
ref, err := reference.Parse(p.Tag()) ref, err := reference.Parse(p.FullTag())
if err != nil { if err != nil {
return fmt.Errorf("could not resolve references for image %s: %v", p.Tag(), err) 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 // get descriptor for root of manifest
desc, err := c.FindDescriptor(p.Tag()) desc, err := c.FindDescriptor(p.FullTag())
if err != nil { if err != nil {
return err return err
} }
@ -322,7 +322,7 @@ func (p Pkg) Build(bos ...BuildOpt) error {
} }
// push the manifest // push the manifest
if err := c.Push(p.Tag()); err != nil { if err := c.Push(p.FullTag()); err != nil {
return err return err
} }
@ -349,7 +349,7 @@ func (p Pkg) Build(bos ...BuildOpt) error {
// tag in docker, if requested // tag in docker, if requested
if bo.targetDocker { if bo.targetDocker {
if err := d.tag(p.Tag(), relTag); err != nil { if err := d.tag(p.FullTag(), relTag); err != nil {
return err 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) fmt.Fprintf(writer, "Building for arch %s as %s\n", arch, tagArch)
if !bo.force { if !bo.force {
ref, err := reference.Parse(p.Tag()) ref, err := reference.Parse(p.FullTag())
if err != nil { if err != nil {
return nil, fmt.Errorf("could not resolve references for image %s: %v", p.Tag(), err) 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 { if err != nil {
return nil, fmt.Errorf("could not resolve references for image %s: %v", tagArch, err) 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 cache *cacheMocker
err string 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"}, {"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")}, {"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"}, {"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" "gopkg.in/yaml.v2"
"github.com/linuxkit/linuxkit/src/cmd/linuxkit/moby" "github.com/linuxkit/linuxkit/src/cmd/linuxkit/moby"
"github.com/linuxkit/linuxkit/src/cmd/linuxkit/util"
) )
// Contains fields settable in the build.yml // Contains fields settable in the build.yml
@ -276,6 +277,10 @@ func (p Pkg) Tag() string {
return p.org + "/" + p.image + ":" + t return p.org + "/" + p.image + ":" + t
} }
func (p Pkg) FullTag() string {
return util.ReferenceExpand(p.Tag())
}
// TrustEnabled returns true if trust is enabled // TrustEnabled returns true if trust is enabled
func (p Pkg) TrustEnabled() bool { func (p Pkg) TrustEnabled() bool {
return p.trust 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
}
}