deploy_bundlefile.go 2.2 KB

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