diff --git a/dockerclient.go b/dockerclient.go index ed79456..340d8bd 100644 --- a/dockerclient.go +++ b/dockerclient.go @@ -539,12 +539,39 @@ func (client *DockerClient) RemoveContainer(id string, force, volumes bool) erro return err } -func (client *DockerClient) ListImages(all bool) ([]*Image, error) { +func (client *DockerClient) ListImages(all bool, filter *ListFilter) ([]*Image, error) { argAll := 0 if all { argAll = 1 } + + filters := make(map[string][]string) + + if filter.Dangling { + filters["dangling"] = []string{"true"} + } + + if len(filter.Keys) > 0 { + for _, key := range filter.Keys { + filters["key"] = append(filters["key"], key) + } + } + + if len(filter.Labels) > 0 { + for _, label := range filter.Labels { + filters["label"] = append(filters["label"], label) + } + } + uri := fmt.Sprintf("/%s/images/json?all=%d", APIVersion, argAll) + if len(filters) > 0 { + mf, err := json.Marshal(filters) + if err != nil { + return nil, err + } + uri += fmt.Sprintf("&filters=%s", url.QueryEscape(string(mf))) + } + data, err := client.doRequest("GET", uri, nil, nil) if err != nil { return nil, err diff --git a/interface.go b/interface.go index 6e83617..748ceb3 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 *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 2961d27..9d62c00 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 *ListFilter) ([]*dockerclient.Image, error) { + args := client.Mock.Called(all, filter) 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 +}