deploy_bundlefile.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. if opts.prune {
  19. services := map[string]struct{}{}
  20. for service := range bundle.Services {
  21. services[service] = struct{}{}
  22. }
  23. pruneServices(ctx, dockerCli, namespace, services)
  24. }
  25. networks := make(map[string]types.NetworkCreate)
  26. for _, service := range bundle.Services {
  27. for _, networkName := range service.Networks {
  28. networks[networkName] = types.NetworkCreate{
  29. Labels: convert.AddStackLabel(namespace, nil),
  30. }
  31. }
  32. }
  33. services := make(map[string]swarm.ServiceSpec)
  34. for internalName, service := range bundle.Services {
  35. name := namespace.Scope(internalName)
  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. nets := []swarm.NetworkAttachmentConfig{}
  44. for _, networkName := range service.Networks {
  45. nets = append(nets, swarm.NetworkAttachmentConfig{
  46. Target: namespace.Scope(networkName),
  47. Aliases: []string{networkName},
  48. })
  49. }
  50. serviceSpec := swarm.ServiceSpec{
  51. Annotations: swarm.Annotations{
  52. Name: name,
  53. Labels: convert.AddStackLabel(namespace, service.Labels),
  54. },
  55. TaskTemplate: swarm.TaskSpec{
  56. ContainerSpec: swarm.ContainerSpec{
  57. Image: service.Image,
  58. Command: service.Command,
  59. Args: service.Args,
  60. Env: service.Env,
  61. // Service Labels will not be copied to Containers
  62. // automatically during the deployment so we apply
  63. // it here.
  64. Labels: convert.AddStackLabel(namespace, nil),
  65. },
  66. },
  67. EndpointSpec: &swarm.EndpointSpec{
  68. Ports: ports,
  69. },
  70. Networks: nets,
  71. }
  72. services[internalName] = serviceSpec
  73. }
  74. if err := createNetworks(ctx, dockerCli, namespace, networks); err != nil {
  75. return err
  76. }
  77. return deployServices(ctx, dockerCli, services, namespace, opts.sendRegistryAuth)
  78. }