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  }