image_list.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package client // import "github.com/docker/docker/client"
  2. import (
  3. "context"
  4. "encoding/json"
  5. "net/url"
  6. "github.com/docker/docker/api/types"
  7. "github.com/docker/docker/api/types/filters"
  8. "github.com/docker/docker/api/types/image"
  9. "github.com/docker/docker/api/types/versions"
  10. )
  11. // ImageList returns a list of images in the docker host.
  12. func (cli *Client) ImageList(ctx context.Context, options types.ImageListOptions) ([]image.Summary, error) {
  13. // Make sure we negotiated (if the client is configured to do so),
  14. // as code below contains API-version specific handling of options.
  15. //
  16. // Normally, version-negotiation (if enabled) would not happen until
  17. // the API request is made.
  18. cli.checkVersion(ctx)
  19. var images []image.Summary
  20. query := url.Values{}
  21. optionFilters := options.Filters
  22. referenceFilters := optionFilters.Get("reference")
  23. if versions.LessThan(cli.version, "1.25") && len(referenceFilters) > 0 {
  24. query.Set("filter", referenceFilters[0])
  25. for _, filterValue := range referenceFilters {
  26. optionFilters.Del("reference", filterValue)
  27. }
  28. }
  29. if optionFilters.Len() > 0 {
  30. //nolint:staticcheck // ignore SA1019 for old code
  31. filterJSON, err := filters.ToParamWithVersion(cli.version, optionFilters)
  32. if err != nil {
  33. return images, err
  34. }
  35. query.Set("filters", filterJSON)
  36. }
  37. if options.All {
  38. query.Set("all", "1")
  39. }
  40. if options.SharedSize && versions.GreaterThanOrEqualTo(cli.version, "1.42") {
  41. query.Set("shared-size", "1")
  42. }
  43. serverResp, err := cli.get(ctx, "/images/json", query, nil)
  44. defer ensureReaderClosed(serverResp)
  45. if err != nil {
  46. return images, err
  47. }
  48. err = json.NewDecoder(serverResp.body).Decode(&images)
  49. return images, err
  50. }