mirror of
https://github.com/mudler/luet.git
synced 2025-09-04 00:34:41 +00:00
Unpack using our moby fork
Signed-off-by: Ettore Di Giacinto <mudler@sabayon.org>
This commit is contained in:
@@ -18,18 +18,18 @@ package docker
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/containerd/containerd/archive"
|
|
||||||
"github.com/docker/cli/cli/trust"
|
"github.com/docker/cli/cli/trust"
|
||||||
"github.com/docker/distribution/reference"
|
"github.com/docker/distribution/reference"
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
|
"github.com/docker/docker/pkg/archive"
|
||||||
"github.com/docker/docker/registry"
|
"github.com/docker/docker/registry"
|
||||||
"github.com/google/go-containerregistry/pkg/authn"
|
"github.com/google/go-containerregistry/pkg/authn"
|
||||||
"github.com/google/go-containerregistry/pkg/name"
|
"github.com/google/go-containerregistry/pkg/name"
|
||||||
"github.com/google/go-containerregistry/pkg/v1/mutate"
|
|
||||||
"github.com/google/go-containerregistry/pkg/v1/remote"
|
"github.com/google/go-containerregistry/pkg/v1/remote"
|
||||||
"github.com/mudler/luet/pkg/bus"
|
"github.com/mudler/luet/pkg/bus"
|
||||||
"github.com/opencontainers/go-digest"
|
"github.com/opencontainers/go-digest"
|
||||||
@@ -184,35 +184,49 @@ func DownloadAndExtractDockerImage(temp, image, dest string, auth *types.AuthCon
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
reader := mutate.Extract(img)
|
defer os.RemoveAll(temp)
|
||||||
defer reader.Close()
|
|
||||||
|
|
||||||
os.RemoveAll(temp)
|
|
||||||
os.RemoveAll(dest)
|
|
||||||
if err := os.MkdirAll(dest, 0700); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
bus.Manager.Publish(bus.EventImagePreUnPack, UnpackEventData{Image: image, Dest: dest})
|
bus.Manager.Publish(bus.EventImagePreUnPack, UnpackEventData{Image: image, Dest: dest})
|
||||||
|
layers, err := img.Layers()
|
||||||
c, err := archive.Apply(context.TODO(), dest, reader)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, fmt.Errorf("reading layers from '%s' image failed: %v", image, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var size int64
|
||||||
|
for _, l := range layers {
|
||||||
|
s, err := l.Size()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("reading layer size from '%s' image failed: %v", image, err)
|
||||||
|
}
|
||||||
|
size += s
|
||||||
|
|
||||||
|
layerReader, err := l.Uncompressed()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("reading uncompressed layer from '%s' image failed: %v", image, err)
|
||||||
|
}
|
||||||
|
defer layerReader.Close()
|
||||||
|
|
||||||
|
// Unpack the tarfile to the rootfs path.
|
||||||
|
// FROM: https://godoc.org/github.com/moby/moby/pkg/archive#TarOptions
|
||||||
|
if err := archive.Untar(layerReader, dest, &archive.TarOptions{
|
||||||
|
NoLchown: false,
|
||||||
|
ExcludePatterns: []string{"dev/"}, // prevent 'operation not permitted'
|
||||||
|
}); err != nil {
|
||||||
|
return nil, fmt.Errorf("extracting '%s' image to directory %s failed: %v", image, dest, err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bus.Manager.Publish(bus.EventImagePostUnPack, UnpackEventData{Image: image, Dest: dest})
|
bus.Manager.Publish(bus.EventImagePostUnPack, UnpackEventData{Image: image, Dest: dest})
|
||||||
|
|
||||||
return &Image{
|
return &Image{
|
||||||
|
|
||||||
Name: image,
|
Name: image,
|
||||||
Labels: m.Annotations,
|
Labels: m.Annotations,
|
||||||
Target: specs.Descriptor{
|
Target: specs.Descriptor{
|
||||||
MediaType: string(mt),
|
MediaType: string(mt),
|
||||||
Digest: digest.Digest(d.String()),
|
Digest: digest.Digest(d.String()),
|
||||||
Size: c,
|
Size: size,
|
||||||
},
|
},
|
||||||
|
ContentSize: size,
|
||||||
ContentSize: c,
|
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user