github.com/rish1988/moby@v25.0.2+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/http" 7 "net/url" 8 "strconv" 9 10 "github.com/docker/docker/api/types" 11 "github.com/docker/docker/api/types/filters" 12 "github.com/docker/docker/api/types/registry" 13 "github.com/docker/docker/errdefs" 14 ) 15 16 // ImageSearch makes the docker host search by a term in a remote registry. 17 // The list of results is not sorted in any fashion. 18 func (cli *Client) ImageSearch(ctx context.Context, term string, options types.ImageSearchOptions) ([]registry.SearchResult, error) { 19 var results []registry.SearchResult 20 query := url.Values{} 21 query.Set("term", term) 22 if options.Limit > 0 { 23 query.Set("limit", strconv.Itoa(options.Limit)) 24 } 25 26 if options.Filters.Len() > 0 { 27 filterJSON, err := filters.ToJSON(options.Filters) 28 if err != nil { 29 return results, err 30 } 31 query.Set("filters", filterJSON) 32 } 33 34 resp, err := cli.tryImageSearch(ctx, query, options.RegistryAuth) 35 defer ensureReaderClosed(resp) 36 if errdefs.IsUnauthorized(err) && options.PrivilegeFunc != nil { 37 newAuthHeader, privilegeErr := options.PrivilegeFunc() 38 if privilegeErr != nil { 39 return results, privilegeErr 40 } 41 resp, err = cli.tryImageSearch(ctx, query, newAuthHeader) 42 } 43 if err != nil { 44 return results, err 45 } 46 47 err = json.NewDecoder(resp.body).Decode(&results) 48 return results, err 49 } 50 51 func (cli *Client) tryImageSearch(ctx context.Context, query url.Values, registryAuth string) (serverResponse, error) { 52 return cli.get(ctx, "/images/search", query, http.Header{ 53 registry.AuthHeader: {registryAuth}, 54 }) 55 }