mirror of
https://github.com/linka-cloud/d2vm.git
synced 2025-06-28 08:02:26 +00:00
feat: add --raw image creation support
refactor: use Option func pattern fix: build respect the --force flag fix: compute correct in-docker input and outpout mount paths Signed-off-by: Adphi <philippe.adrien.nousse@gmail.com>
This commit is contained in:
@ -15,6 +15,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
@ -40,7 +41,41 @@ var (
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
// TODO(adphi): resolve context path
|
||||
if runtime.GOOS != "linux" {
|
||||
return docker.RunD2VM(cmd.Context(), d2vm.Image, d2vm.Version, cmd.Name(), os.Args[2:]...)
|
||||
ctxAbsPath, err := filepath.Abs(args[0])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
dockerFileAbsPath, err := filepath.Abs(file)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !strings.HasPrefix(dockerFileAbsPath, ctxAbsPath) {
|
||||
return fmt.Errorf("Dockerfile must be in the context directory path")
|
||||
}
|
||||
outputPath, err := filepath.Abs(output)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
var (
|
||||
in = ctxAbsPath
|
||||
out = filepath.Dir(outputPath)
|
||||
)
|
||||
dargs := os.Args[2:]
|
||||
for i, v := range dargs {
|
||||
switch v {
|
||||
case file:
|
||||
rel, err := filepath.Rel(in, file)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to construct Dockerfile container paths: %w", err)
|
||||
}
|
||||
dargs[i] = filepath.Join("/in", rel)
|
||||
case output:
|
||||
dargs[i] = filepath.Join("/out", output)
|
||||
case args[0]:
|
||||
dargs[i] = "/in"
|
||||
}
|
||||
}
|
||||
return docker.RunD2VM(cmd.Context(), d2vm.Image, d2vm.Version, in, out, cmd.Name(), os.Args[2:]...)
|
||||
}
|
||||
size, err := parseSize(size)
|
||||
if err != nil {
|
||||
@ -49,11 +84,25 @@ var (
|
||||
if file == "" {
|
||||
file = filepath.Join(args[0], "Dockerfile")
|
||||
}
|
||||
if _, err := os.Stat(output); err == nil || !os.IsNotExist(err) {
|
||||
if !force {
|
||||
return fmt.Errorf("%s already exists", output)
|
||||
}
|
||||
}
|
||||
logrus.Infof("building docker image from %s", file)
|
||||
if err := docker.Build(cmd.Context(), tag, file, args[0], buildArgs...); err != nil {
|
||||
return err
|
||||
}
|
||||
return d2vm.Convert(cmd.Context(), tag, size, password, output, cmdLineExtra, d2vm.NetworkManager(networkManager))
|
||||
return d2vm.Convert(
|
||||
cmd.Context(),
|
||||
tag,
|
||||
d2vm.WithSize(size),
|
||||
d2vm.WithPassword(password),
|
||||
d2vm.WithOutput(output),
|
||||
d2vm.WithCmdLineExtra(cmdLineExtra),
|
||||
d2vm.WithNetworkManager(d2vm.NetworkManager(networkManager)),
|
||||
d2vm.WithRaw(raw),
|
||||
)
|
||||
},
|
||||
}
|
||||
)
|
||||
@ -70,4 +119,5 @@ func init() {
|
||||
buildCmd.Flags().BoolVar(&force, "force", false, "Override output image")
|
||||
buildCmd.Flags().StringVar(&cmdLineExtra, "append-to-cmdline", "", "Extra kernel cmdline arguments to append to the generated one")
|
||||
buildCmd.Flags().StringVar(&networkManager, "network-manager", "", "Network manager to use for the image: none, netplan, ifupdown")
|
||||
buildCmd.Flags().BoolVar(&raw, "raw", false, "Just convert the container to virtual machine image without installing anything more")
|
||||
}
|
||||
|
@ -17,6 +17,7 @@ package main
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strings"
|
||||
|
||||
@ -29,6 +30,7 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
raw bool
|
||||
pull = false
|
||||
cmdLineExtra = ""
|
||||
|
||||
@ -39,7 +41,19 @@ var (
|
||||
SilenceUsage: true,
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
if runtime.GOOS != "linux" {
|
||||
return docker.RunD2VM(cmd.Context(), d2vm.Image, d2vm.Version, cmd.Name(), os.Args[2:]...)
|
||||
abs, err := filepath.Abs(output)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
out := filepath.Dir(abs)
|
||||
dargs := os.Args[2:]
|
||||
for i, v := range dargs {
|
||||
if v == output {
|
||||
dargs[i] = filepath.Join("/out", filepath.Base(output))
|
||||
break
|
||||
}
|
||||
}
|
||||
return docker.RunD2VM(cmd.Context(), d2vm.Image, d2vm.Version, out, out, cmd.Name(), dargs...)
|
||||
}
|
||||
img := args[0]
|
||||
tag := "latest"
|
||||
@ -55,11 +69,6 @@ var (
|
||||
return fmt.Errorf("%s already exists", output)
|
||||
}
|
||||
}
|
||||
if _, err := os.Stat(output); err == nil || !os.IsNotExist(err) {
|
||||
if !force {
|
||||
return fmt.Errorf("%s already exists", output)
|
||||
}
|
||||
}
|
||||
found := false
|
||||
if !pull {
|
||||
imgs, err := docker.ImageList(cmd.Context(), img)
|
||||
@ -77,7 +86,16 @@ var (
|
||||
return err
|
||||
}
|
||||
}
|
||||
return d2vm.Convert(cmd.Context(), img, size, password, output, cmdLineExtra, d2vm.NetworkManager(networkManager))
|
||||
return d2vm.Convert(
|
||||
cmd.Context(),
|
||||
img,
|
||||
d2vm.WithSize(size),
|
||||
d2vm.WithPassword(password),
|
||||
d2vm.WithOutput(output),
|
||||
d2vm.WithCmdLineExtra(cmdLineExtra),
|
||||
d2vm.WithNetworkManager(d2vm.NetworkManager(networkManager)),
|
||||
d2vm.WithRaw(raw),
|
||||
)
|
||||
},
|
||||
}
|
||||
)
|
||||
@ -98,5 +116,6 @@ func init() {
|
||||
convertCmd.Flags().BoolVarP(&force, "force", "f", false, "Override output qcow2 image")
|
||||
convertCmd.Flags().StringVar(&cmdLineExtra, "append-to-cmdline", "", "Extra kernel cmdline arguments to append to the generated one")
|
||||
convertCmd.Flags().StringVar(&networkManager, "network-manager", "", "Network manager to use for the image: none, netplan, ifupdown")
|
||||
convertCmd.Flags().BoolVar(&raw, "raw", false, "Just convert the container to virtual machine image without installing anything more")
|
||||
rootCmd.AddCommand(convertCmd)
|
||||
}
|
||||
|
Binary file not shown.
Reference in New Issue
Block a user