2022-04-19 12:01:08 +00:00
// Copyright 2022 Linka Cloud All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
2022-05-20 14:36:36 +00:00
"os"
"path/filepath"
"runtime"
2022-04-21 16:28:50 +00:00
"strings"
2022-04-19 12:01:08 +00:00
"github.com/google/uuid"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"go.linka.cloud/d2vm"
"go.linka.cloud/d2vm/pkg/docker"
)
var (
2022-08-08 15:58:49 +00:00
file = "Dockerfile"
tag = uuid . New ( ) . String ( )
networkManager string
buildArgs [ ] string
buildCmd = & cobra . Command {
2022-04-19 12:01:08 +00:00
Use : "build [context directory]" ,
2022-04-21 16:28:50 +00:00
Short : "Build a vm image from Dockerfile" ,
2022-04-19 12:01:08 +00:00
Args : cobra . ExactArgs ( 1 ) ,
RunE : func ( cmd * cobra . Command , args [ ] string ) error {
2022-05-20 14:36:36 +00:00
// TODO(adphi): resolve context path
if runtime . GOOS != "linux" {
return docker . RunD2VM ( cmd . Context ( ) , d2vm . Image , d2vm . Version , cmd . Name ( ) , os . Args [ 2 : ] ... )
}
2022-04-19 12:01:08 +00:00
size , err := parseSize ( size )
if err != nil {
return err
}
2022-05-20 14:36:36 +00:00
if file == "" {
file = filepath . Join ( args [ 0 ] , "Dockerfile" )
}
2022-08-07 16:24:02 +00:00
logrus . Infof ( "building docker image from %s" , file )
2022-04-24 14:27:04 +00:00
if err := docker . Build ( cmd . Context ( ) , tag , file , args [ 0 ] , buildArgs ... ) ; err != nil {
2022-04-19 12:01:08 +00:00
return err
}
2022-08-08 15:58:49 +00:00
return d2vm . Convert ( cmd . Context ( ) , tag , size , password , output , cmdLineExtra , d2vm . NetworkManager ( networkManager ) )
2022-04-19 12:01:08 +00:00
} ,
}
)
func init ( ) {
rootCmd . AddCommand ( buildCmd )
2022-05-20 14:36:36 +00:00
buildCmd . Flags ( ) . StringVarP ( & file , "file" , "f" , "" , "Name of the Dockerfile" )
2022-04-21 16:28:50 +00:00
buildCmd . Flags ( ) . StringArrayVar ( & buildArgs , "build-arg" , nil , "Set build-time variables" )
2022-04-19 12:01:08 +00:00
2022-08-04 16:09:11 +00:00
buildCmd . Flags ( ) . StringVarP ( & output , "output" , "o" , output , "The output image, the extension determine the image format, raw will be used if none. Supported formats: " + strings . Join ( d2vm . OutputFormats ( ) , " " ) )
2022-04-19 12:01:08 +00:00
buildCmd . Flags ( ) . StringVarP ( & password , "password" , "p" , "root" , "Root user password" )
2022-04-21 16:28:50 +00:00
buildCmd . Flags ( ) . StringVarP ( & size , "size" , "s" , "10G" , "The output image size" )
buildCmd . Flags ( ) . BoolVar ( & force , "force" , false , "Override output image" )
2022-08-07 16:24:02 +00:00
buildCmd . Flags ( ) . StringVar ( & cmdLineExtra , "append-to-cmdline" , "" , "Extra kernel cmdline arguments to append to the generated one" )
2022-08-08 15:58:49 +00:00
buildCmd . Flags ( ) . StringVar ( & networkManager , "network-manager" , "" , "Network manager to use for the image: none, netplan, ifupdown" )
2022-04-19 12:01:08 +00:00
}