mirror of
https://github.com/mudler/luet.git
synced 2025-06-23 22:17:59 +00:00
Create a util sub cmd to add all utils that are handy for development and already present in the luet codebase. We expose in this case `luet util unpack` to unpack a docker image without a docker daemon running.
107 lines
3.0 KiB
Go
107 lines
3.0 KiB
Go
package imgworker
|
|
|
|
// FROM Slightly adapted from genuinetools/img worker
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"path/filepath"
|
|
|
|
"github.com/containerd/containerd/content/local"
|
|
"github.com/containerd/containerd/diff/apply"
|
|
"github.com/containerd/containerd/diff/walking"
|
|
ctdmetadata "github.com/containerd/containerd/metadata"
|
|
"github.com/containerd/containerd/platforms"
|
|
"github.com/containerd/containerd/remotes/docker"
|
|
ctdsnapshot "github.com/containerd/containerd/snapshots"
|
|
"github.com/containerd/containerd/snapshots/native"
|
|
"github.com/moby/buildkit/cache/metadata"
|
|
containerdsnapshot "github.com/moby/buildkit/snapshot/containerd"
|
|
"github.com/moby/buildkit/util/binfmt_misc"
|
|
"github.com/moby/buildkit/util/leaseutil"
|
|
"github.com/moby/buildkit/worker/base"
|
|
specs "github.com/opencontainers/image-spec/specs-go/v1"
|
|
bolt "go.etcd.io/bbolt"
|
|
)
|
|
|
|
// createWorkerOpt creates a base.WorkerOpt to be used for a new worker.
|
|
func (c *Client) createWorkerOpt() (opt base.WorkerOpt, err error) {
|
|
|
|
if c.opts != nil {
|
|
return *c.opts, nil
|
|
}
|
|
|
|
// Create the metadata store.
|
|
md, err := metadata.NewStore(filepath.Join(c.root, "metadata.db"))
|
|
if err != nil {
|
|
return opt, err
|
|
}
|
|
|
|
snapshotRoot := filepath.Join(c.root, "snapshots")
|
|
|
|
s, err := native.NewSnapshotter(snapshotRoot)
|
|
if err != nil {
|
|
return opt, fmt.Errorf("creating %s snapshotter failed: %v", c.backend, err)
|
|
}
|
|
|
|
// Create the content store locally.
|
|
contentStore, err := local.NewStore(filepath.Join(c.root, "content"))
|
|
if err != nil {
|
|
return opt, err
|
|
}
|
|
|
|
// Open the bolt database for metadata.
|
|
db, err := bolt.Open(filepath.Join(c.root, "containerdmeta.db"), 0644, nil)
|
|
if err != nil {
|
|
return opt, err
|
|
}
|
|
|
|
// Create the new database for metadata.
|
|
mdb := ctdmetadata.NewDB(db, contentStore, map[string]ctdsnapshot.Snapshotter{
|
|
c.backend: s,
|
|
})
|
|
if err := mdb.Init(context.TODO()); err != nil {
|
|
return opt, err
|
|
}
|
|
|
|
// Create the image store.
|
|
imageStore := ctdmetadata.NewImageStore(mdb)
|
|
|
|
contentStore = containerdsnapshot.NewContentStore(mdb.ContentStore(), "buildkit")
|
|
|
|
id, err := base.ID(c.root)
|
|
if err != nil {
|
|
return opt, err
|
|
}
|
|
|
|
xlabels := base.Labels("oci", c.backend)
|
|
|
|
var supportedPlatforms []specs.Platform
|
|
for _, p := range binfmt_misc.SupportedPlatforms(false) {
|
|
parsed, err := platforms.Parse(p)
|
|
if err != nil {
|
|
return opt, err
|
|
}
|
|
supportedPlatforms = append(supportedPlatforms, platforms.Normalize(parsed))
|
|
}
|
|
|
|
opt = base.WorkerOpt{
|
|
ID: id,
|
|
Labels: xlabels,
|
|
MetadataStore: md,
|
|
Snapshotter: containerdsnapshot.NewSnapshotter(c.backend, mdb.Snapshotter(c.backend), "buildkit", nil),
|
|
ContentStore: contentStore,
|
|
Applier: apply.NewFileSystemApplier(contentStore),
|
|
Differ: walking.NewWalkingDiff(contentStore),
|
|
ImageStore: imageStore,
|
|
Platforms: supportedPlatforms,
|
|
RegistryHosts: docker.ConfigureDefaultRegistries(),
|
|
LeaseManager: leaseutil.WithNamespace(ctdmetadata.NewLeaseManager(mdb), "buildkit"),
|
|
GarbageCollect: mdb.GarbageCollect,
|
|
}
|
|
|
|
c.opts = &opt
|
|
|
|
return opt, err
|
|
}
|