github.com/zhuohuang-hust/src-cbuild@v0.0.0-20230105071821-c7aab3e7c840/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.VarP(&opts.endpoint.publishPorts, flagPublish, "p", "Publish a port as a node port") 43 flags.MarkHidden(flagPublish) 44 flags.Var(&opts.groups, flagGroup, "Set one or more supplementary user groups for the container") 45 flags.Var(&opts.dns, flagDNS, "Set custom DNS servers") 46 flags.Var(&opts.dnsOption, flagDNSOption, "Set DNS options") 47 flags.Var(&opts.dnsSearch, flagDNSSearch, "Set custom DNS search domains") 48 flags.Var(&opts.hosts, flagHost, "Set one or more custom host-to-IP mappings (host:ip)") 49 flags.Var(&opts.endpoint.expandedPorts, flagPort, "Publish a port") 50 51 flags.SetInterspersed(false) 52 return cmd 53 } 54 55 func runCreate(dockerCli *command.DockerCli, opts *serviceOptions) error { 56 apiClient := dockerCli.Client() 57 createOpts := types.ServiceCreateOptions{} 58 59 service, err := opts.ToService() 60 if err != nil { 61 return err 62 } 63 64 specifiedSecrets := opts.secrets.Value() 65 if len(specifiedSecrets) > 0 { 66 // parse and validate secrets 67 secrets, err := parseSecrets(apiClient, specifiedSecrets) 68 if err != nil { 69 return err 70 } 71 service.TaskTemplate.ContainerSpec.Secrets = secrets 72 73 } 74 75 ctx := context.Background() 76 77 // only send auth if flag was set 78 if opts.registryAuth { 79 // Retrieve encoded auth token from the image reference 80 encodedAuth, err := command.RetrieveAuthTokenFromImage(ctx, dockerCli, opts.image) 81 if err != nil { 82 return err 83 } 84 createOpts.EncodedRegistryAuth = encodedAuth 85 } 86 87 response, err := apiClient.ServiceCreate(ctx, service, createOpts) 88 if err != nil { 89 return err 90 } 91 92 for _, warning := range response.Warnings { 93 fmt.Fprintln(dockerCli.Err(), warning) 94 } 95 96 fmt.Fprintf(dockerCli.Out(), "%s\n", response.ID) 97 return nil 98 }