deploy_bundlefile.go 2.2 KB

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