github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/engine/client/image_search.go (about) 1 package client // import "github.com/docker/docker/client" 2 3 import ( 4 "context" 5 "encoding/json" 6 "fmt" 7 "net/url" 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 to 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 query.Set("limit", fmt.Sprintf("%d", options.Limit)) 22 23 if options.Filters.Len() > 0 { 24 filterJSON, err := filters.ToJSON(options.Filters) 25 if err != nil { 26 return results, err 27 } 28 query.Set("filters", filterJSON) 29 } 30 31 resp, err := cli.tryImageSearch(ctx, query, options.RegistryAuth) 32 defer ensureReaderClosed(resp) 33 if errdefs.IsUnauthorized(err) && options.PrivilegeFunc != nil { 34 newAuthHeader, privilegeErr := options.PrivilegeFunc() 35 if privilegeErr != nil { 36 return results, privilegeErr 37 } 38 resp, err = cli.tryImageSearch(ctx, query, newAuthHeader) 39 } 40 if err != nil { 41 return results, err 42 } 43 44 err = json.NewDecoder(resp.body).Decode(&results) 45 return results, err 46 } 47 48 func (cli *Client) tryImageSearch(ctx context.Context, query url.Values, registryAuth string) (serverResponse, error) { 49 headers := map[string][]string{"X-Registry-Auth": {registryAuth}} 50 return cli.get(ctx, "/images/search", query, headers) 51 }