diff --git a/.gitignore b/.gitignore index 1cce6663..a23a90ef 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.swp +.idea/ luet tests/integration/shunit2 tests/integration/bin diff --git a/cmd/util.go b/cmd/util.go index 9759ac42..cfd338e9 100644 --- a/cmd/util.go +++ b/cmd/util.go @@ -20,6 +20,7 @@ import ( "os" "path/filepath" "runtime" + "strings" "github.com/docker/docker/api/types" "github.com/docker/go-units" @@ -34,6 +35,10 @@ import ( "github.com/spf13/cobra" ) +const ( + filePrefix = "file://" +) + func pack(ctx *context.Context, p, dst, imageName, arch, OS string) error { tempimage, err := ctx.TempFile("tempimage") @@ -126,7 +131,7 @@ func NewUnpackCommand() *cobra.Command { RegistryToken: registryToken, } - if !local { + if !local && !strings.HasPrefix(image, filePrefix) { info, err := docker.DownloadAndExtractDockerImage(util.DefaultContext, image, destination, auth, verify) if err != nil { util.DefaultContext.Error(err.Error()) diff --git a/pkg/helpers/docker/docker.go b/pkg/helpers/docker/docker.go index f0b8be95..579bd006 100644 --- a/pkg/helpers/docker/docker.go +++ b/pkg/helpers/docker/docker.go @@ -20,6 +20,10 @@ import ( "encoding/hex" "net/http" "os" + "strings" + + v1 "github.com/google/go-containerregistry/pkg/v1" + "github.com/google/go-containerregistry/pkg/v1/tarball" "github.com/containerd/containerd/images" luetimages "github.com/mudler/luet/pkg/api/core/image" @@ -42,6 +46,11 @@ import ( "github.com/theupdateframework/notary/tuf/data" ) +const ( + filePrefix = "file://" + fileImageSeparator = ":/" +) + // See also https://github.com/docker/cli/blob/88c6089300a82d3373892adf6845a4fed1a4ba8d/cli/command/image/trust.go#L171 func verifyImage(image string, authConfig *types.AuthConfig) (string, error) { @@ -196,18 +205,26 @@ func DownloadAndExtractDockerImage(ctx luettypes.Context, image, dest string, au } func ExtractDockerImage(ctx luettypes.Context, local, dest string) (*images.Image, error) { + var img v1.Image if !fileHelper.Exists(dest) { if err := os.MkdirAll(dest, os.ModePerm); err != nil { return nil, errors.Wrapf(err, "cannot create destination directory") } } - ref, err := name.ParseReference(local) - if err != nil { - return nil, err + var err error + if strings.HasPrefix(local, filePrefix) { + parts := strings.Split(local, fileImageSeparator) + if len(parts) == 2 && parts[1] != "" { + img, err = tarball.ImageFromPath(parts[1], nil) + } + } else { + ref, err := name.ParseReference(local) + if err != nil { + return nil, err + } + img, err = daemon.Image(ref) } - - img, err := daemon.Image(ref) if err != nil { return nil, err }