diff --git a/src/cmd/linuxkit/cache/source.go b/src/cmd/linuxkit/cache/source.go index e75af50b0..2c29fa602 100644 --- a/src/cmd/linuxkit/cache/source.go +++ b/src/cmd/linuxkit/cache/source.go @@ -7,7 +7,7 @@ import ( "github.com/containerd/containerd/reference" "github.com/google/go-containerregistry/pkg/name" - "github.com/google/go-containerregistry/pkg/v1" + v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/mutate" "github.com/google/go-containerregistry/pkg/v1/tarball" lktspec "github.com/linuxkit/linuxkit/src/cmd/linuxkit/spec" @@ -73,10 +73,13 @@ func (c ImageSource) TarReader() (io.ReadCloser, error) { } // V1TarReader return an io.ReadCloser to read the image as a v1 tarball -func (c ImageSource) V1TarReader() (io.ReadCloser, error) { +func (c ImageSource) V1TarReader(overrideName string) (io.ReadCloser, error) { imageName := c.ref.String() - - refName, err := name.ParseReference(imageName) + saveName := imageName + if overrideName != "" { + saveName = overrideName + } + refName, err := name.ParseReference(saveName) if err != nil { return nil, fmt.Errorf("error parsing image name: %v", err) } diff --git a/src/cmd/linuxkit/cache_export.go b/src/cmd/linuxkit/cache_export.go index 98b7d06ce..2b02ab23a 100644 --- a/src/cmd/linuxkit/cache_export.go +++ b/src/cmd/linuxkit/cache_export.go @@ -19,6 +19,7 @@ func cacheExport(args []string) { arch := fs.String("arch", runtime.GOARCH, "Architecture to resolve an index to an image, if the provided image name is an index") outfile := fs.String("outfile", "", "Path to file to save output, '-' for stdout") format := fs.String("format", "oci", "export format, one of 'oci', 'filesystem'") + tagName := fs.String("name", "", "override the provided image name in the exported tar file; useful only for format=oci") if err := fs.Parse(args); err != nil { log.Fatal("Unable to parse args") @@ -49,7 +50,11 @@ func cacheExport(args []string) { var reader io.ReadCloser switch *format { case "oci": - reader, err = src.V1TarReader() + fullTagName := fullname + if *tagName != "" { + fullTagName = util.ReferenceExpand(*tagName) + } + reader, err = src.V1TarReader(fullTagName) case "filesystem": reader, err = src.TarReader() default: diff --git a/src/cmd/linuxkit/docker/source.go b/src/cmd/linuxkit/docker/source.go index a2194536d..e3486ab90 100644 --- a/src/cmd/linuxkit/docker/source.go +++ b/src/cmd/linuxkit/docker/source.go @@ -6,7 +6,7 @@ import ( "io" "github.com/containerd/containerd/reference" - "github.com/google/go-containerregistry/pkg/v1" + v1 "github.com/google/go-containerregistry/pkg/v1" imagespec "github.com/opencontainers/image-spec/specs-go/v1" ) @@ -78,8 +78,12 @@ func (d ImageSource) TarReader() (io.ReadCloser, error) { } // V1TarReader return an io.ReadCloser to read the save of the image -func (d ImageSource) V1TarReader() (io.ReadCloser, error) { - return Save(d.ref.String()) +func (d ImageSource) V1TarReader(overrideName string) (io.ReadCloser, error) { + saveName := d.ref.String() + if overrideName != "" { + saveName = overrideName + } + return Save(saveName) } // Descriptor return the descriptor of the image. diff --git a/src/cmd/linuxkit/pkglib/build.go b/src/cmd/linuxkit/pkglib/build.go index 4a14eac16..d55e835c5 100644 --- a/src/cmd/linuxkit/pkglib/build.go +++ b/src/cmd/linuxkit/pkglib/build.go @@ -352,7 +352,7 @@ func (p Pkg) Build(bos ...BuildOpt) error { return err } cacheSource := c.NewSource(&archRef, platform.Architecture, desc) - reader, err := cacheSource.V1TarReader() + reader, err := cacheSource.V1TarReader("") if err != nil { return fmt.Errorf("unable to get reader from cache: %v", err) } diff --git a/src/cmd/linuxkit/pkglib/build_test.go b/src/cmd/linuxkit/pkglib/build_test.go index a859046f9..7f50ff185 100644 --- a/src/cmd/linuxkit/pkglib/build_test.go +++ b/src/cmd/linuxkit/pkglib/build_test.go @@ -283,7 +283,7 @@ func (c cacheMockerSource) Config() (imagespec.ImageConfig, error) { func (c cacheMockerSource) TarReader() (io.ReadCloser, error) { return nil, errors.New("unsupported") } -func (c cacheMockerSource) V1TarReader() (io.ReadCloser, error) { +func (c cacheMockerSource) V1TarReader(overrideName string) (io.ReadCloser, error) { _, found := c.c.images[c.ref.String()] if !found { return nil, fmt.Errorf("no image found with ref: %s", c.ref.String()) diff --git a/src/cmd/linuxkit/spec/image.go b/src/cmd/linuxkit/spec/image.go index 55826b01d..2588f8ce8 100644 --- a/src/cmd/linuxkit/spec/image.go +++ b/src/cmd/linuxkit/spec/image.go @@ -3,7 +3,7 @@ package spec import ( "io" - "github.com/google/go-containerregistry/pkg/v1" + v1 "github.com/google/go-containerregistry/pkg/v1" imagespec "github.com/opencontainers/image-spec/specs-go/v1" ) @@ -12,10 +12,10 @@ import ( type ImageSource interface { // Config get the config for the image Config() (imagespec.ImageConfig, error) - // TarReader get the flattened filesystem of the image as a tar stream/ + // TarReader get the flattened filesystem of the image as a tar stream TarReader() (io.ReadCloser, error) // Descriptor get the v1.Descriptor of the image Descriptor() *v1.Descriptor - // V1TarReader get the image as v1 tarball, also compatibel with `docker load` - V1TarReader() (io.ReadCloser, error) + // V1TarReader get the image as v1 tarball, also compatible with `docker load`. If name arg is not "", override name of image in tarfile from default of image. + V1TarReader(overrideName string) (io.ReadCloser, error) }