github.com/adityamillind98/moby@v23.0.0-rc.4+incompatible/client/image_search.go (about) 1 package client // import "github.com/docker/docker/client" 2 3 import ( 4 "context" 5 "encoding/json" 6 "net/url" 7 "strconv" 8 9 "github.com/docker/docker/api/types" 10 "github.com/docker/docker/api/types/filters" 11 "github.com/docker/docker/api/types/registry" 12 "github.com/docker/docker/errdefs" 13 ) 14 15 // ImageSearch makes the docker host search by a term in a remote registry. 16 // The list of results is not sorted in any fashion. 17 func (cli *Client) ImageSearch(ctx context.Context, term string, options types.ImageSearchOptions) ([]registry.SearchResult, error) { 18 var results []registry.SearchResult 19 query := url.Values{} 20 query.Set("term", term) 21 if options.Limit > 0 { 22 query.Set("limit", strconv.Itoa(options.Limit)) 23 } 24 25 if options.Filters.Len() > 0 { 26 filterJSON, err := filters.ToJSON(options.Filters) 27 if err != nil { 28 return results, err 29 } 30 query.Set("filters", filterJSON) 31 } 32 33 resp, err := cli.tryImageSearch(ctx, query, options.RegistryAuth) 34 defer ensureReaderClosed(resp) 35 if errdefs.IsUnauthorized(err) && options.PrivilegeFunc != nil { 36 newAuthHeader, privilegeErr := options.PrivilegeFunc() 37 if privilegeErr != nil { 38 return results, privilegeErr 39 } 40 resp, err = cli.tryImageSearch(ctx, query, newAuthHeader) 41 } 42 if err != nil { 43 return results, err 44 } 45 46 err = json.NewDecoder(resp.body).Decode(&results) 47 return results, err 48 } 49 50 func (cli *Client) tryImageSearch(ctx context.Context, query url.Values, registryAuth string) (serverResponse, error) { 51 headers := map[string][]string{"X-Registry-Auth": {registryAuth}} 52 return cli.get(ctx, "/images/search", query, headers) 53 }