79 lines
1.7 KiB
Go
79 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var rootCmd = &cobra.Command{
|
|
Use: "tarpoon",
|
|
Short: "Build Docker images",
|
|
Long: "`docker build && docker push` without the `docker`. Push a tarball to a registry for distribution",
|
|
Run: rootRun,
|
|
}
|
|
|
|
var (
|
|
baseImage string
|
|
workDir string
|
|
exec []string
|
|
)
|
|
|
|
func init() {
|
|
rootCmd.PersistentFlags().StringVarP(&baseImage, "base-image", "b", "scratch", "Base image to append the tar to")
|
|
rootCmd.PersistentFlags().StringVarP(&workDir, "workdir", "w", "/", "Working directory of the new container")
|
|
rootCmd.PersistentFlags().StringSliceVarP(&exec, "exec", "e", []string{"/bin/sh", "-c"}, "What to exec in the newly built container")
|
|
}
|
|
|
|
func main() {
|
|
if err := rootCmd.Execute(); err != nil {
|
|
fmt.Println(err)
|
|
os.Exit(-1)
|
|
}
|
|
}
|
|
|
|
func rootRun(cmd *cobra.Command, args []string) {
|
|
if len(args) < 2 {
|
|
fmt.Println("tarpoon TARFILE DOCKER_PATH")
|
|
os.Exit(1)
|
|
}
|
|
fmt.Printf("** Creating build dir\n")
|
|
dir, err := NewBuildDir()
|
|
defer dir.Close()
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
os.Exit(1)
|
|
}
|
|
fmt.Printf("** Build dir is %s\n", dir.dir)
|
|
fmt.Printf("** Loading base image %s\n", baseImage)
|
|
err = dir.LoadBase(baseImage)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
os.Exit(1)
|
|
}
|
|
fmt.Printf("** Applying tarball %s\n", args[0])
|
|
err = dir.AddTarLayer(args[0])
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
os.Exit(1)
|
|
}
|
|
fmt.Printf("** Preparing image\n")
|
|
err = dir.DumpImageConfig()
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
os.Exit(1)
|
|
}
|
|
err = dir.WriteManifest()
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
os.Exit(1)
|
|
}
|
|
fmt.Printf("** Pushing image\n")
|
|
err = dir.Push(args[1])
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
}
|