diff --git a/dockerclient.go b/dockerclient.go index e96d274..77fdb3b 100644 --- a/dockerclient.go +++ b/dockerclient.go @@ -539,12 +539,47 @@ func (client *DockerClient) RemoveContainer(id string, force, volumes bool) erro return err } -func (client *DockerClient) ListImages(all bool) ([]*Image, error) { - argAll := 0 +func (client *DockerClient) ListImages(all bool, filter string, filters *ListFilter) ([]*Image, error) { + v := url.Values{} + + argAll := "0" if all { - argAll = 1 + argAll = "1" + } + v.Set("all", argAll) + + if filter != "" { + v.Set("filter", filter) + } + + filtersData := make(map[string][]string) + + if filters.Dangling { + filtersData["dangling"] = []string{"true"} + } + + if len(filters.Keys) > 0 { + for _, key := range filters.Keys { + filtersData["key"] = append(filtersData["key"], key) + } + } + + if len(filters.Labels) > 0 { + for _, label := range filters.Labels { + filtersData["label"] = append(filtersData["label"], label) + } } - uri := fmt.Sprintf("/%s/images/json?all=%d", APIVersion, argAll) + + if len(filtersData) > 0 { + mf, err := json.Marshal(filtersData) + if err != nil { + return nil, err + } + v.Set("filters", string(mf)) + } + + uri := fmt.Sprintf("/%s/images/json?%s", APIVersion, v.Encode()) + data, err := client.doRequest("GET", uri, nil, nil) if err != nil { return nil, err diff --git a/interface.go b/interface.go index 17f0641..7ec5dd2 100644 --- a/interface.go +++ b/interface.go @@ -35,7 +35,7 @@ type Client interface { PullImage(name string, auth *AuthConfig) error LoadImage(reader io.Reader) error RemoveContainer(id string, force, volumes bool) error - ListImages(all bool) ([]*Image, error) + ListImages(all bool, filter string, filters *ListFilter) ([]*Image, error) RemoveImage(name string) ([]*ImageDelete, error) PauseContainer(name string) error UnpauseContainer(name string) error diff --git a/mockclient/mock.go b/mockclient/mock.go index 6babeea..49dc3b2 100644 --- a/mockclient/mock.go +++ b/mockclient/mock.go @@ -116,8 +116,8 @@ func (client *MockClient) RemoveContainer(id string, force, volumes bool) error return args.Error(0) } -func (client *MockClient) ListImages(all bool) ([]*dockerclient.Image, error) { - args := client.Mock.Called(all) +func (client *MockClient) ListImages(all bool, filter string, filters *ListFilter) ([]*dockerclient.Image, error) { + args := client.Mock.Called(all, filter, filters) return args.Get(0).([]*dockerclient.Image), args.Error(1) } diff --git a/types.go b/types.go index e1b5527..779b8a8 100644 --- a/types.go +++ b/types.go @@ -437,3 +437,9 @@ type BuildImage struct { CpuSetMems string CgroupParent string } + +type ListFilter struct { + Dangling bool + Labels []string + Keys []string +}