Use ondisk reference for deltas

This commit is contained in:
Ettore Di Giacinto
2021-10-26 12:14:01 +02:00
parent daa9eb98d2
commit aea3cdff8d
7 changed files with 28 additions and 9 deletions

View File

@@ -46,6 +46,7 @@ func ExtractDeltaAdditionsFiles(
includeRegexp := compileRegexes(includes) includeRegexp := compileRegexes(includes)
excludeRegexp := compileRegexes(excludes) excludeRegexp := compileRegexes(excludes)
filesSrc := map[string]interface{}{} filesSrc := map[string]interface{}{}
srcReader := mutate.Extract(srcimg) srcReader := mutate.Extract(srcimg)
defer srcReader.Close() defer srcReader.Close()

View File

@@ -156,7 +156,7 @@ RUN echo bar > /test2`))
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
defer os.RemoveAll(result) // clean up defer os.RemoveAll(result) // clean up
img, err := b.ImageReference(resultingImage) img, err := b.ImageReference(resultingImage, false)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
_, _, err = image.ExtractTo( _, _, err = image.ExtractTo(
ctx, ctx,
@@ -206,7 +206,7 @@ RUN echo bar > /test2`))
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
defer os.RemoveAll(result) // clean up defer os.RemoveAll(result) // clean up
img, err := b.ImageReference(resultingImage) img, err := b.ImageReference(resultingImage, false)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
_, _, err = image.ExtractTo( _, _, err = image.ExtractTo(
ctx, ctx,

View File

@@ -35,6 +35,6 @@ type CompilerBackend interface {
Push(opts backend.Options) error Push(opts backend.Options) error
ImageAvailable(string) bool ImageAvailable(string) bool
ImageReference(img1 string) (v1.Image, error) ImageReference(img1 string, ondisk bool) (v1.Image, error)
ImageExists(string) bool ImageExists(string) bool
} }

View File

@@ -18,6 +18,7 @@ package backend
import ( import (
"os/exec" "os/exec"
"github.com/google/go-containerregistry/pkg/crane"
"github.com/google/go-containerregistry/pkg/name" "github.com/google/go-containerregistry/pkg/name"
"github.com/google/go-containerregistry/pkg/v1/daemon" "github.com/google/go-containerregistry/pkg/v1/daemon"
bus "github.com/mudler/luet/pkg/api/core/bus" bus "github.com/mudler/luet/pkg/api/core/bus"
@@ -138,7 +139,24 @@ func (s *SimpleDocker) Push(opts Options) error {
return nil 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) ref, err := name.ParseReference(a)
if err != nil { if err != nil {
return nil, err return nil, err

View File

@@ -71,7 +71,7 @@ func (s *SimpleImg) RemoveImage(opts Options) error {
return nil 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") f, err := s.ctx.Config.GetSystem().TempFile("snapshot")
if err != nil { if err != nil {

View File

@@ -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 { if err != nil {
return nil, err 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) 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 { if err != nil {
return nil, err return nil, err
} }
cs.Options.Context.Info(pkgTag, ":hammer: Retrieving reference for", runnerOpts.ImageName) 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 { if err != nil {
return nil, err return nil, err
} }

View File

@@ -196,7 +196,7 @@ func (d *dockerRepositoryGenerator) Generate(r *LuetSystemRepository, imagePrefi
if err != nil { if err != nil {
return errors.Wrapf(err, "while downloading '%s'", imageRepository) return errors.Wrapf(err, "while downloading '%s'", imageRepository)
} }
img, err := r.GetBackend().ImageReference(imageRepository) img, err := r.GetBackend().ImageReference(imageRepository, true)
if err != nil { if err != nil {
return errors.Wrapf(err, "while downloading '%s'", imageRepository) return errors.Wrapf(err, "while downloading '%s'", imageRepository)
} }