github.com/ijc/docker-app@v0.6.1-0.20181012090447-c7ca8bc483fb/cmd/docker-app/deploy.go (about) 1 package main 2 3 import ( 4 "os" 5 6 "github.com/docker/app/internal" 7 "github.com/docker/app/internal/packager" 8 "github.com/docker/app/render" 9 "github.com/docker/app/types" 10 "github.com/docker/cli/cli" 11 "github.com/docker/cli/cli/command" 12 "github.com/docker/cli/cli/command/stack" 13 "github.com/docker/cli/cli/command/stack/options" 14 "github.com/docker/cli/cli/command/stack/swarm" 15 cliopts "github.com/docker/cli/opts" 16 "github.com/spf13/cobra" 17 "github.com/spf13/pflag" 18 ) 19 20 type deployOptions struct { 21 deployComposeFiles []string 22 deploySettingsFiles []string 23 deployEnv []string 24 deployOrchestrator string 25 deployKubeConfig string 26 deployNamespace string 27 deployStackName string 28 deploySendRegistryAuth bool 29 } 30 31 // deployCmd represents the deploy command 32 func deployCmd(dockerCli command.Cli) *cobra.Command { 33 var opts deployOptions 34 35 cmd := &cobra.Command{ 36 Use: "deploy [<app-name>]", 37 Short: "Deploy or update an application", 38 Long: `Deploy the application on either Swarm or Kubernetes.`, 39 Args: cli.RequiresMaxArgs(1), 40 RunE: func(cmd *cobra.Command, args []string) error { 41 return runDeploy(dockerCli, cmd.Flags(), firstOrEmpty(args), opts) 42 }, 43 } 44 45 cmd.Flags().StringArrayVarP(&opts.deploySettingsFiles, "settings-files", "f", []string{}, "Override settings files") 46 cmd.Flags().StringArrayVarP(&opts.deployEnv, "set", "s", []string{}, "Override settings values") 47 cmd.Flags().StringVarP(&opts.deployOrchestrator, "orchestrator", "o", "swarm", "Orchestrator to deploy on (swarm, kubernetes)") 48 cmd.Flags().StringVarP(&opts.deployKubeConfig, "kubeconfig", "k", "", "Kubernetes config file to use") 49 cmd.Flags().StringVarP(&opts.deployNamespace, "namespace", "n", "default", "Kubernetes namespace to deploy into") 50 cmd.Flags().StringVarP(&opts.deployStackName, "name", "d", "", "Stack name (default: app name)") 51 cmd.Flags().BoolVarP(&opts.deploySendRegistryAuth, "with-registry-auth", "", false, "Sends registry auth") 52 if internal.Experimental == "on" { 53 cmd.Flags().StringArrayVarP(&opts.deployComposeFiles, "compose-files", "c", []string{}, "Override Compose files") 54 } 55 return cmd 56 } 57 58 func runDeploy(dockerCli command.Cli, flags *pflag.FlagSet, appname string, opts deployOptions) error { 59 app, err := packager.Extract(appname, 60 types.WithSettingsFiles(opts.deploySettingsFiles...), 61 types.WithComposeFiles(opts.deployComposeFiles...), 62 ) 63 if err != nil { 64 return err 65 } 66 defer app.Cleanup() 67 deployOrchestrator, err := command.GetStackOrchestrator(opts.deployOrchestrator, dockerCli.ConfigFile().StackOrchestrator, dockerCli.Err()) 68 if err != nil { 69 return err 70 } 71 d := cliopts.ConvertKVStringsToMap(opts.deployEnv) 72 rendered, err := render.Render(app, d) 73 if err != nil { 74 return err 75 } 76 stackName := opts.deployStackName 77 if stackName == "" { 78 stackName = internal.AppNameFromDir(app.Name) 79 } 80 if app.Source.ShouldRunInsideDirectory() { 81 if err := os.Chdir(app.Path); err != nil { 82 return err 83 } 84 } 85 return stack.RunDeploy(dockerCli, flags, rendered, deployOrchestrator, options.Deploy{ 86 Namespace: stackName, 87 ResolveImage: swarm.ResolveImageAlways, 88 SendRegistryAuth: opts.deploySendRegistryAuth, 89 }) 90 }