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  }