mirror of
https://github.com/mudler/luet.git
synced 2025-09-05 17:20:29 +00:00
Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
39e62f3321 | ||
|
9dcaeb0870 | ||
|
c4affb0f0e | ||
|
4c1b9b92af |
@@ -86,7 +86,6 @@ Build packages specifying multiple definition trees:
|
|||||||
viper.BindPFlag("wait", cmd.Flags().Lookup("wait"))
|
viper.BindPFlag("wait", cmd.Flags().Lookup("wait"))
|
||||||
viper.BindPFlag("keep-images", cmd.Flags().Lookup("keep-images"))
|
viper.BindPFlag("keep-images", cmd.Flags().Lookup("keep-images"))
|
||||||
|
|
||||||
viper.BindPFlag("general.show_build_output", cmd.Flags().Lookup("live-output"))
|
|
||||||
viper.BindPFlag("backend-args", cmd.Flags().Lookup("backend-args"))
|
viper.BindPFlag("backend-args", cmd.Flags().Lookup("backend-args"))
|
||||||
|
|
||||||
},
|
},
|
||||||
@@ -334,7 +333,6 @@ func init() {
|
|||||||
buildCmd.Flags().Float32("solver-discount", 1.0, "Solver discount rate")
|
buildCmd.Flags().Float32("solver-discount", 1.0, "Solver discount rate")
|
||||||
buildCmd.Flags().Int("solver-attempts", 9000, "Solver maximum attempts")
|
buildCmd.Flags().Int("solver-attempts", 9000, "Solver maximum attempts")
|
||||||
buildCmd.Flags().Bool("solver-concurrent", false, "Use concurrent solver (experimental)")
|
buildCmd.Flags().Bool("solver-concurrent", false, "Use concurrent solver (experimental)")
|
||||||
buildCmd.Flags().Bool("live-output", true, "Enable live output of the build phase.")
|
|
||||||
buildCmd.Flags().Bool("from-repositories", false, "Consume the user-defined repositories to pull specfiles from")
|
buildCmd.Flags().Bool("from-repositories", false, "Consume the user-defined repositories to pull specfiles from")
|
||||||
buildCmd.Flags().Bool("rebuild", false, "To combine with --pull. Allows to rebuild the target package even if an image is available, against a local values file")
|
buildCmd.Flags().Bool("rebuild", false, "To combine with --pull. Allows to rebuild the target package even if an image is available, against a local values file")
|
||||||
buildCmd.Flags().Bool("pretend", false, "Just print what packages will be compiled")
|
buildCmd.Flags().Bool("pretend", false, "Just print what packages will be compiled")
|
||||||
|
@@ -30,7 +30,7 @@ var cfgFile string
|
|||||||
var Verbose bool
|
var Verbose bool
|
||||||
|
|
||||||
const (
|
const (
|
||||||
LuetCLIVersion = "0.22.0"
|
LuetCLIVersion = "0.22.1"
|
||||||
LuetEnvPrefix = "LUET"
|
LuetEnvPrefix = "LUET"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
26
cmd/util.go
26
cmd/util.go
@@ -89,7 +89,7 @@ func NewUnpackCommand() *cobra.Command {
|
|||||||
Use: "unpack image path",
|
Use: "unpack image path",
|
||||||
Short: "Unpack a docker image natively",
|
Short: "Unpack a docker image natively",
|
||||||
Long: `unpack doesn't need the docker daemon to run, and unpacks a docker image in the specified directory:
|
Long: `unpack doesn't need the docker daemon to run, and unpacks a docker image in the specified directory:
|
||||||
|
|
||||||
luet util unpack golang:alpine /alpine
|
luet util unpack golang:alpine /alpine
|
||||||
`,
|
`,
|
||||||
PreRun: func(cmd *cobra.Command, args []string) {
|
PreRun: func(cmd *cobra.Command, args []string) {
|
||||||
@@ -107,7 +107,7 @@ func NewUnpackCommand() *cobra.Command {
|
|||||||
util.DefaultContext.Error("Invalid path %s", destination)
|
util.DefaultContext.Error("Invalid path %s", destination)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
local, _ := cmd.Flags().GetBool("local")
|
||||||
verify, _ := cmd.Flags().GetBool("verify")
|
verify, _ := cmd.Flags().GetBool("verify")
|
||||||
user, _ := cmd.Flags().GetString("auth-username")
|
user, _ := cmd.Flags().GetString("auth-username")
|
||||||
pass, _ := cmd.Flags().GetString("auth-password")
|
pass, _ := cmd.Flags().GetString("auth-password")
|
||||||
@@ -126,13 +126,22 @@ func NewUnpackCommand() *cobra.Command {
|
|||||||
RegistryToken: registryToken,
|
RegistryToken: registryToken,
|
||||||
}
|
}
|
||||||
|
|
||||||
info, err := docker.DownloadAndExtractDockerImage(util.DefaultContext, image, destination, auth, verify)
|
if !local {
|
||||||
if err != nil {
|
info, err := docker.DownloadAndExtractDockerImage(util.DefaultContext, image, destination, auth, verify)
|
||||||
util.DefaultContext.Error(err.Error())
|
if err != nil {
|
||||||
os.Exit(1)
|
util.DefaultContext.Error(err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
util.DefaultContext.Info(fmt.Sprintf("Pulled: %s %s", info.Target.Digest, info.Name))
|
||||||
|
util.DefaultContext.Info(fmt.Sprintf("Size: %s", units.BytesSize(float64(info.Target.Size))))
|
||||||
|
} else {
|
||||||
|
info, err := docker.ExtractDockerImage(util.DefaultContext, image, destination)
|
||||||
|
if err != nil {
|
||||||
|
util.DefaultContext.Error(err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
util.DefaultContext.Info(fmt.Sprintf("Size: %s", units.BytesSize(float64(info.Target.Size))))
|
||||||
}
|
}
|
||||||
util.DefaultContext.Info(fmt.Sprintf("Pulled: %s %s", info.Target.Digest, info.Name))
|
|
||||||
util.DefaultContext.Info(fmt.Sprintf("Size: %s", units.BytesSize(float64(info.Target.Size))))
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -143,6 +152,7 @@ func NewUnpackCommand() *cobra.Command {
|
|||||||
c.Flags().String("auth-identity-token", "", "Authentication identity token")
|
c.Flags().String("auth-identity-token", "", "Authentication identity token")
|
||||||
c.Flags().String("auth-registry-token", "", "Authentication registry token")
|
c.Flags().String("auth-registry-token", "", "Authentication registry token")
|
||||||
c.Flags().Bool("verify", false, "Verify signed images to notary before to pull")
|
c.Flags().Bool("verify", false, "Verify signed images to notary before to pull")
|
||||||
|
c.Flags().Bool("local", false, "Unpack local image")
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -220,7 +220,7 @@ func setDefaults(viper *viper.Viper) {
|
|||||||
viper.SetDefault("general.concurrency", runtime.NumCPU())
|
viper.SetDefault("general.concurrency", runtime.NumCPU())
|
||||||
viper.SetDefault("general.debug", false)
|
viper.SetDefault("general.debug", false)
|
||||||
viper.SetDefault("general.quiet", false)
|
viper.SetDefault("general.quiet", false)
|
||||||
viper.SetDefault("general.show_build_output", false)
|
viper.SetDefault("general.show_build_output", true)
|
||||||
viper.SetDefault("general.fatal_warnings", false)
|
viper.SetDefault("general.fatal_warnings", false)
|
||||||
viper.SetDefault("general.http_timeout", 360)
|
viper.SetDefault("general.http_timeout", 360)
|
||||||
|
|
||||||
@@ -278,6 +278,7 @@ func InitViper(RootCmd *cobra.Command) {
|
|||||||
pflags.Float32("solver-rate", 0.7, "Solver learning rate")
|
pflags.Float32("solver-rate", 0.7, "Solver learning rate")
|
||||||
pflags.Float32("solver-discount", 1.0, "Solver discount rate")
|
pflags.Float32("solver-discount", 1.0, "Solver discount rate")
|
||||||
pflags.Int("solver-attempts", 9000, "Solver maximum attempts")
|
pflags.Int("solver-attempts", 9000, "Solver maximum attempts")
|
||||||
|
pflags.Bool("live-output", true, "Show live output during build")
|
||||||
|
|
||||||
pflags.Bool("same-owner", true, "Maintain same owner on uncompress.")
|
pflags.Bool("same-owner", true, "Maintain same owner on uncompress.")
|
||||||
pflags.Int("concurrency", runtime.NumCPU(), "Concurrency")
|
pflags.Int("concurrency", runtime.NumCPU(), "Concurrency")
|
||||||
@@ -303,6 +304,7 @@ func InitViper(RootCmd *cobra.Command) {
|
|||||||
viper.BindPFlag("general.same_owner", pflags.Lookup("same-owner"))
|
viper.BindPFlag("general.same_owner", pflags.Lookup("same-owner"))
|
||||||
viper.BindPFlag("plugin", pflags.Lookup("plugin"))
|
viper.BindPFlag("plugin", pflags.Lookup("plugin"))
|
||||||
viper.BindPFlag("general.http_timeout", pflags.Lookup("http-timeout"))
|
viper.BindPFlag("general.http_timeout", pflags.Lookup("http-timeout"))
|
||||||
|
viper.BindPFlag("general.show_build_output", pflags.Lookup("live-output"))
|
||||||
|
|
||||||
// Currently I maintain this only from cli.
|
// Currently I maintain this only from cli.
|
||||||
viper.BindPFlag("no_spinner", pflags.Lookup("no-spinner"))
|
viper.BindPFlag("no_spinner", pflags.Lookup("no-spinner"))
|
||||||
|
@@ -33,6 +33,7 @@ import (
|
|||||||
"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/remote"
|
"github.com/google/go-containerregistry/pkg/v1/remote"
|
||||||
|
"github.com/google/go-containerregistry/pkg/v1/daemon"
|
||||||
"github.com/mudler/luet/pkg/api/core/bus"
|
"github.com/mudler/luet/pkg/api/core/bus"
|
||||||
"github.com/opencontainers/go-digest"
|
"github.com/opencontainers/go-digest"
|
||||||
specs "github.com/opencontainers/image-spec/specs-go/v1"
|
specs "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
@@ -192,3 +193,60 @@ func DownloadAndExtractDockerImage(ctx luettypes.Context, image, dest string, au
|
|||||||
},
|
},
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ExtractDockerImage(ctx luettypes.Context, local, dest string)(*images.Image, error) {
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
img, err := daemon.Image(ref)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
m, err := img.Manifest()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
mt, err := img.MediaType()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
d, err := img.Digest()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var c int64
|
||||||
|
c, _, err = luetimages.ExtractTo(
|
||||||
|
ctx,
|
||||||
|
img,
|
||||||
|
dest,
|
||||||
|
nil,
|
||||||
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
bus.Manager.Publish(bus.EventImagePostUnPack, UnpackEventData{Image: local, Dest: dest})
|
||||||
|
|
||||||
|
return &images.Image{
|
||||||
|
Name: local,
|
||||||
|
Labels: m.Annotations,
|
||||||
|
Target: specs.Descriptor{
|
||||||
|
MediaType: string(mt),
|
||||||
|
Digest: digest.Digest(d.String()),
|
||||||
|
Size: c,
|
||||||
|
},
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
@@ -866,6 +866,8 @@ func (r *LuetSystemRepository) Sync(ctx types.Context, force bool) (*LuetSystemR
|
|||||||
toTimeSync = true
|
toTimeSync = true
|
||||||
ctx.Debug(r.Name, "is old, refresh is suggested")
|
ctx.Debug(r.Name, "is old, refresh is suggested")
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
toTimeSync = true
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.Debug("Sync of the repository", r.Name, "in progress...")
|
ctx.Debug("Sync of the repository", r.Name, "in progress...")
|
||||||
@@ -893,6 +895,10 @@ func (r *LuetSystemRepository) Sync(ctx types.Context, force bool) (*LuetSystemR
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer os.RemoveAll(file)
|
defer os.RemoveAll(file)
|
||||||
|
defer func() {
|
||||||
|
now := time.Now().Format(time.RFC3339)
|
||||||
|
ioutil.WriteFile(filepath.Join(repobasedir, "SYNCTIME"), []byte(now), os.ModePerm)
|
||||||
|
}()
|
||||||
} else {
|
} else {
|
||||||
downloadedRepoMeta, err = r.ReadSpecFile(repoFile)
|
downloadedRepoMeta, err = r.ReadSpecFile(repoFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -990,8 +996,6 @@ func (r *LuetSystemRepository) Sync(ctx types.Context, force bool) (*LuetSystemR
|
|||||||
downloadedRepoMeta.GetRevision(),
|
downloadedRepoMeta.GetRevision(),
|
||||||
time.Unix(tsec, 0).String()))
|
time.Unix(tsec, 0).String()))
|
||||||
|
|
||||||
now := time.Now().Format(time.RFC3339)
|
|
||||||
ioutil.WriteFile(filepath.Join(repobasedir, "SYNCTIME"), []byte(now), os.ModePerm)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
meta, err := NewLuetSystemRepositoryMetadata(
|
meta, err := NewLuetSystemRepositoryMetadata(
|
||||||
|
Reference in New Issue
Block a user