service_update.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package client // import "github.com/docker/docker/client"
  2. import (
  3. "context"
  4. "encoding/json"
  5. "net/url"
  6. "strconv"
  7. "github.com/docker/docker/api/types"
  8. "github.com/docker/docker/api/types/swarm"
  9. )
  10. // ServiceUpdate updates a Service. The version number is required to avoid conflicting writes.
  11. // It should be the value as set *before* the update. You can find this value in the Meta field
  12. // of swarm.Service, which can be found using ServiceInspectWithRaw.
  13. func (cli *Client) ServiceUpdate(ctx context.Context, serviceID string, version swarm.Version, service swarm.ServiceSpec, options types.ServiceUpdateOptions) (types.ServiceUpdateResponse, error) {
  14. var (
  15. query = url.Values{}
  16. response = types.ServiceUpdateResponse{}
  17. )
  18. headers := map[string][]string{
  19. "version": {cli.version},
  20. }
  21. if options.EncodedRegistryAuth != "" {
  22. headers["X-Registry-Auth"] = []string{options.EncodedRegistryAuth}
  23. }
  24. if options.RegistryAuthFrom != "" {
  25. query.Set("registryAuthFrom", options.RegistryAuthFrom)
  26. }
  27. if options.Rollback != "" {
  28. query.Set("rollback", options.Rollback)
  29. }
  30. query.Set("version", strconv.FormatUint(version.Index, 10))
  31. if err := validateServiceSpec(service); err != nil {
  32. return response, err
  33. }
  34. // ensure that the image is tagged
  35. var resolveWarning string
  36. switch {
  37. case service.TaskTemplate.ContainerSpec != nil:
  38. if taggedImg := imageWithTagString(service.TaskTemplate.ContainerSpec.Image); taggedImg != "" {
  39. service.TaskTemplate.ContainerSpec.Image = taggedImg
  40. }
  41. if options.QueryRegistry {
  42. resolveWarning = resolveContainerSpecImage(ctx, cli, &service.TaskTemplate, options.EncodedRegistryAuth)
  43. }
  44. case service.TaskTemplate.PluginSpec != nil:
  45. if taggedImg := imageWithTagString(service.TaskTemplate.PluginSpec.Remote); taggedImg != "" {
  46. service.TaskTemplate.PluginSpec.Remote = taggedImg
  47. }
  48. if options.QueryRegistry {
  49. resolveWarning = resolvePluginSpecRemote(ctx, cli, &service.TaskTemplate, options.EncodedRegistryAuth)
  50. }
  51. }
  52. resp, err := cli.post(ctx, "/services/"+serviceID+"/update", query, service, headers)
  53. defer ensureReaderClosed(resp)
  54. if err != nil {
  55. return response, err
  56. }
  57. err = json.NewDecoder(resp.body).Decode(&response)
  58. if resolveWarning != "" {
  59. response.Warnings = append(response.Warnings, resolveWarning)
  60. }
  61. return response, err
  62. }