Docker Remote API Filter Exited

2019-02-05 13:47发布

问题:

I see in the Docker Remote API Docs that filter can be used to filter on status but I'm unsure how to form the request:

https://docs.docker.com/reference/api/docker_remote_api_v1.16/#list-containers

GET /containers/json?filters=status[exited] ?????

How should this be formatted to display ONLY exited containers?

回答1:

jwodder is correct on the filter but I wanted to go through this step by step as I wasn't familiar with the Go data types.

The Docker API documentation refers to using a map[string][]string for a filter, which is a Go map (hash table)

  • map[string] defines a map with keys of type string

  • []string is the type definition for the values in the map. A slice [] is an array without fixed length. Then the slice is made up of string values.

So the API requires a hash map of arrays containing strings. This Go Playground demonstrates marshalling the Go filter data:

mapS := map[string][]string{ "status":[]string{"exited"} }

Into JSON:

{ "status": [ "exited" ] }

So adding that JSON to the Docker API request you get:

GET /containers/json?all=1&filters={%22status%22:[%22exited%22]}

all=1 is included to report exited containers (like -a on the command line).

It might be easier for non Go people if they just documented the JSON structure for the API : /



回答2:

By my reading of the docs, it should be:

GET /containers/json?filters={"status":["exited"]}

Some of that might need to be URL-encoded, though.



回答3:

The most elegant way to use docker with curl and don't bother with encoding I found in this answer. Basically, it's tell curl to use data as query parameter and encode it. To get exited container the query may look like:

curl -G -XGET "http://localhost:5555/containers/json" \
    -d 'all=1' \
    --data-urlencode 'filters={"status":["exited"]}' | python -m json.tool


标签: docker