image_search.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package client
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net/http"
  6. "net/url"
  7. "github.com/docker/docker/api/types"
  8. "github.com/docker/docker/api/types/filters"
  9. "github.com/docker/docker/api/types/registry"
  10. "golang.org/x/net/context"
  11. )
  12. // ImageSearch makes the docker host to search by a term in a remote registry.
  13. // The list of results is not sorted in any fashion.
  14. func (cli *Client) ImageSearch(ctx context.Context, term string, options types.ImageSearchOptions) ([]registry.SearchResult, error) {
  15. var results []registry.SearchResult
  16. query := url.Values{}
  17. query.Set("term", term)
  18. query.Set("limit", fmt.Sprintf("%d", options.Limit))
  19. if options.Filters.Len() > 0 {
  20. filterJSON, err := filters.ToParam(options.Filters)
  21. if err != nil {
  22. return results, err
  23. }
  24. query.Set("filters", filterJSON)
  25. }
  26. resp, err := cli.tryImageSearch(ctx, query, options.RegistryAuth)
  27. if resp.statusCode == http.StatusUnauthorized && options.PrivilegeFunc != nil {
  28. newAuthHeader, privilegeErr := options.PrivilegeFunc()
  29. if privilegeErr != nil {
  30. return results, privilegeErr
  31. }
  32. resp, err = cli.tryImageSearch(ctx, query, newAuthHeader)
  33. }
  34. if err != nil {
  35. return results, err
  36. }
  37. err = json.NewDecoder(resp.body).Decode(&results)
  38. ensureReaderClosed(resp)
  39. return results, err
  40. }
  41. func (cli *Client) tryImageSearch(ctx context.Context, query url.Values, registryAuth string) (serverResponse, error) {
  42. headers := map[string][]string{"X-Registry-Auth": {registryAuth}}
  43. return cli.get(ctx, "/images/search", query, headers)
  44. }