github.com/zhuohuang-hust/src-cbuild@v0.0.0-20230105071821-c7aab3e7c840/cli/command/stack/deploy_bundlefile.go (about) 1 package stack 2 3 import ( 4 "golang.org/x/net/context" 5 6 "github.com/docker/docker/api/types" 7 "github.com/docker/docker/api/types/swarm" 8 "github.com/docker/docker/cli/command" 9 ) 10 11 func deployBundle(ctx context.Context, dockerCli *command.DockerCli, opts deployOptions) error { 12 bundle, err := loadBundlefile(dockerCli.Err(), opts.namespace, opts.bundlefile) 13 if err != nil { 14 return err 15 } 16 17 if err := checkDaemonIsSwarmManager(ctx, dockerCli); err != nil { 18 return err 19 } 20 21 namespace := namespace{name: opts.namespace} 22 23 networks := make(map[string]types.NetworkCreate) 24 for _, service := range bundle.Services { 25 for _, networkName := range service.Networks { 26 networks[networkName] = types.NetworkCreate{ 27 Labels: getStackLabels(namespace.name, nil), 28 } 29 } 30 } 31 32 services := make(map[string]swarm.ServiceSpec) 33 for internalName, service := range bundle.Services { 34 name := namespace.scope(internalName) 35 36 var ports []swarm.PortConfig 37 for _, portSpec := range service.Ports { 38 ports = append(ports, swarm.PortConfig{ 39 Protocol: swarm.PortConfigProtocol(portSpec.Protocol), 40 TargetPort: portSpec.Port, 41 }) 42 } 43 44 nets := []swarm.NetworkAttachmentConfig{} 45 for _, networkName := range service.Networks { 46 nets = append(nets, swarm.NetworkAttachmentConfig{ 47 Target: namespace.scope(networkName), 48 Aliases: []string{networkName}, 49 }) 50 } 51 52 serviceSpec := swarm.ServiceSpec{ 53 Annotations: swarm.Annotations{ 54 Name: name, 55 Labels: getStackLabels(namespace.name, service.Labels), 56 }, 57 TaskTemplate: swarm.TaskSpec{ 58 ContainerSpec: swarm.ContainerSpec{ 59 Image: service.Image, 60 Command: service.Command, 61 Args: service.Args, 62 Env: service.Env, 63 // Service Labels will not be copied to Containers 64 // automatically during the deployment so we apply 65 // it here. 66 Labels: getStackLabels(namespace.name, nil), 67 }, 68 }, 69 EndpointSpec: &swarm.EndpointSpec{ 70 Ports: ports, 71 }, 72 Networks: nets, 73 } 74 75 services[internalName] = serviceSpec 76 } 77 78 if err := createNetworks(ctx, dockerCli, namespace, networks); err != nil { 79 return err 80 } 81 return deployServices(ctx, dockerCli, services, namespace, opts.sendRegistryAuth) 82 }