diff --git a/pkg/api/core/image/extract.go b/pkg/api/core/image/extract.go index 2f4d2022..2cdd530b 100644 --- a/pkg/api/core/image/extract.go +++ b/pkg/api/core/image/extract.go @@ -46,6 +46,7 @@ func ExtractDeltaAdditionsFiles( includeRegexp := compileRegexes(includes) excludeRegexp := compileRegexes(excludes) filesSrc := map[string]interface{}{} + srcReader := mutate.Extract(srcimg) defer srcReader.Close() diff --git a/pkg/api/core/types/artifact/artifact_test.go b/pkg/api/core/types/artifact/artifact_test.go index bd886b9f..e2b37f8a 100644 --- a/pkg/api/core/types/artifact/artifact_test.go +++ b/pkg/api/core/types/artifact/artifact_test.go @@ -156,7 +156,7 @@ RUN echo bar > /test2`)) Expect(err).ToNot(HaveOccurred()) defer os.RemoveAll(result) // clean up - img, err := b.ImageReference(resultingImage) + img, err := b.ImageReference(resultingImage, false) Expect(err).ToNot(HaveOccurred()) _, _, err = image.ExtractTo( ctx, @@ -206,7 +206,7 @@ RUN echo bar > /test2`)) Expect(err).ToNot(HaveOccurred()) defer os.RemoveAll(result) // clean up - img, err := b.ImageReference(resultingImage) + img, err := b.ImageReference(resultingImage, false) Expect(err).ToNot(HaveOccurred()) _, _, err = image.ExtractTo( ctx, diff --git a/pkg/compiler/backend.go b/pkg/compiler/backend.go index 51a14ed0..26e66c9d 100644 --- a/pkg/compiler/backend.go +++ b/pkg/compiler/backend.go @@ -35,6 +35,6 @@ type CompilerBackend interface { Push(opts backend.Options) error ImageAvailable(string) bool - ImageReference(img1 string) (v1.Image, error) + ImageReference(img1 string, ondisk bool) (v1.Image, error) ImageExists(string) bool } diff --git a/pkg/compiler/backend/simpledocker.go b/pkg/compiler/backend/simpledocker.go index 02305120..ba13e50f 100644 --- a/pkg/compiler/backend/simpledocker.go +++ b/pkg/compiler/backend/simpledocker.go @@ -18,6 +18,7 @@ package backend import ( "os/exec" + "github.com/google/go-containerregistry/pkg/crane" "github.com/google/go-containerregistry/pkg/name" "github.com/google/go-containerregistry/pkg/v1/daemon" bus "github.com/mudler/luet/pkg/api/core/bus" @@ -138,7 +139,24 @@ func (s *SimpleDocker) Push(opts Options) error { return nil } -func (s *SimpleDocker) ImageReference(a string) (v1.Image, error) { +func (s *SimpleDocker) ImageReference(a string, ondisk bool) (v1.Image, error) { + if ondisk { + f, err := s.ctx.Config.GetSystem().TempFile("snapshot") + if err != nil { + return nil, err + } + buildarg := []string{"save", a, "-o", f.Name()} + s.ctx.Spinner() + defer s.ctx.SpinnerStop() + + out, err := exec.Command("docker", buildarg...).CombinedOutput() + if err != nil { + return nil, errors.Wrap(err, "Failed saving image: "+string(out)) + } + + return crane.Load(f.Name()) + } + ref, err := name.ParseReference(a) if err != nil { return nil, err diff --git a/pkg/compiler/backend/simpleimg.go b/pkg/compiler/backend/simpleimg.go index c3aeed23..1a1729bc 100644 --- a/pkg/compiler/backend/simpleimg.go +++ b/pkg/compiler/backend/simpleimg.go @@ -71,7 +71,7 @@ func (s *SimpleImg) RemoveImage(opts Options) error { return nil } -func (s *SimpleImg) ImageReference(a string) (v1.Image, error) { +func (s *SimpleImg) ImageReference(a string, ondisk bool) (v1.Image, error) { f, err := s.ctx.Config.GetSystem().TempFile("snapshot") if err != nil { diff --git a/pkg/compiler/compiler.go b/pkg/compiler/compiler.go index b9026374..0f99e42e 100644 --- a/pkg/compiler/compiler.go +++ b/pkg/compiler/compiler.go @@ -234,7 +234,7 @@ func (cs *LuetCompiler) unpackFs(concurrency int, keepPermissions bool, p *compi } } - img, err := cs.Backend.ImageReference(runnerOpts.ImageName) + img, err := cs.Backend.ImageReference(runnerOpts.ImageName, false) if err != nil { return nil, err } @@ -313,14 +313,14 @@ func (cs *LuetCompiler) unpackDelta(concurrency int, keepPermissions bool, p *co cs.Options.Context.Info(pkgTag, ":hammer: Retrieving reference for", builderOpts.ImageName) - ref, err := cs.Backend.ImageReference(builderOpts.ImageName) + ref, err := cs.Backend.ImageReference(builderOpts.ImageName, true) if err != nil { return nil, err } cs.Options.Context.Info(pkgTag, ":hammer: Retrieving reference for", runnerOpts.ImageName) - ref2, err := cs.Backend.ImageReference(runnerOpts.ImageName) + ref2, err := cs.Backend.ImageReference(runnerOpts.ImageName, true) if err != nil { return nil, err } diff --git a/pkg/installer/repository_docker.go b/pkg/installer/repository_docker.go index 293875b0..5870e1f5 100644 --- a/pkg/installer/repository_docker.go +++ b/pkg/installer/repository_docker.go @@ -196,7 +196,7 @@ func (d *dockerRepositoryGenerator) Generate(r *LuetSystemRepository, imagePrefi if err != nil { return errors.Wrapf(err, "while downloading '%s'", imageRepository) } - img, err := r.GetBackend().ImageReference(imageRepository) + img, err := r.GetBackend().ImageReference(imageRepository, true) if err != nil { return errors.Wrapf(err, "while downloading '%s'", imageRepository) }