deploy_bundlefile.go 2.1 KB

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