github.com/fabiokung/docker@v0.11.2-0.20170222101415-4534dcd49497/cli/command/service/create.go (about) 1 package service 2 3 import ( 4 "fmt" 5 6 "github.com/docker/docker/api/types" 7 "github.com/docker/docker/cli" 8 "github.com/docker/docker/cli/command" 9 "github.com/spf13/cobra" 10 "golang.org/x/net/context" 11 ) 12 13 func newCreateCommand(dockerCli *command.DockerCli) *cobra.Command { 14 opts := newServiceOptions() 15 16 cmd := &cobra.Command{ 17 Use: "create [OPTIONS] IMAGE [COMMAND] [ARG...]", 18 Short: "Create a new service", 19 Args: cli.RequiresMinArgs(1), 20 RunE: func(cmd *cobra.Command, args []string) error { 21 opts.image = args[0] 22 if len(args) > 1 { 23 opts.args = args[1:] 24 } 25 return runCreate(dockerCli, opts) 26 }, 27 } 28 flags := cmd.Flags() 29 flags.StringVar(&opts.mode, flagMode, "replicated", "Service mode (replicated or global)") 30 flags.StringVar(&opts.name, flagName, "", "Service name") 31 32 addServiceFlags(cmd, opts) 33 34 flags.VarP(&opts.labels, flagLabel, "l", "Service labels") 35 flags.Var(&opts.containerLabels, flagContainerLabel, "Container labels") 36 flags.VarP(&opts.env, flagEnv, "e", "Set environment variables") 37 flags.Var(&opts.envFile, flagEnvFile, "Read in a file of environment variables") 38 flags.Var(&opts.mounts, flagMount, "Attach a filesystem mount to the service") 39 flags.Var(&opts.constraints, flagConstraint, "Placement constraints") 40 flags.Var(&opts.networks, flagNetwork, "Network attachments") 41 flags.Var(&opts.secrets, flagSecret, "Specify secrets to expose to the service") 42 flags.SetAnnotation(flagSecret, "version", []string{"1.25"}) 43 flags.VarP(&opts.endpoint.publishPorts, flagPublish, "p", "Publish a port as a node port") 44 flags.Var(&opts.groups, flagGroup, "Set one or more supplementary user groups for the container") 45 flags.SetAnnotation(flagGroup, "version", []string{"1.25"}) 46 flags.Var(&opts.dns, flagDNS, "Set custom DNS servers") 47 flags.SetAnnotation(flagDNS, "version", []string{"1.25"}) 48 flags.Var(&opts.dnsOption, flagDNSOption, "Set DNS options") 49 flags.SetAnnotation(flagDNSOption, "version", []string{"1.25"}) 50 flags.Var(&opts.dnsSearch, flagDNSSearch, "Set custom DNS search domains") 51 flags.SetAnnotation(flagDNSSearch, "version", []string{"1.25"}) 52 flags.Var(&opts.hosts, flagHost, "Set one or more custom host-to-IP mappings (host:ip)") 53 flags.SetAnnotation(flagHost, "version", []string{"1.25"}) 54 55 flags.SetInterspersed(false) 56 return cmd 57 } 58 59 func runCreate(dockerCli *command.DockerCli, opts *serviceOptions) error { 60 apiClient := dockerCli.Client() 61 createOpts := types.ServiceCreateOptions{} 62 63 service, err := opts.ToService() 64 if err != nil { 65 return err 66 } 67 68 specifiedSecrets := opts.secrets.Value() 69 if len(specifiedSecrets) > 0 { 70 // parse and validate secrets 71 secrets, err := ParseSecrets(apiClient, specifiedSecrets) 72 if err != nil { 73 return err 74 } 75 service.TaskTemplate.ContainerSpec.Secrets = secrets 76 77 } 78 79 ctx := context.Background() 80 81 if err := resolveServiceImageDigest(dockerCli, &service); err != nil { 82 return err 83 } 84 85 // only send auth if flag was set 86 if opts.registryAuth { 87 // Retrieve encoded auth token from the image reference 88 encodedAuth, err := command.RetrieveAuthTokenFromImage(ctx, dockerCli, opts.image) 89 if err != nil { 90 return err 91 } 92 createOpts.EncodedRegistryAuth = encodedAuth 93 } 94 95 response, err := apiClient.ServiceCreate(ctx, service, createOpts) 96 if err != nil { 97 return err 98 } 99 100 for _, warning := range response.Warnings { 101 fmt.Fprintln(dockerCli.Err(), warning) 102 } 103 104 fmt.Fprintf(dockerCli.Out(), "%s\n", response.ID) 105 return nil 106 }