Docker API can’t apply json filters Docker API can’t apply json filters curl curl

Docker API can’t apply json filters


I should prefix this with the fact that I have never seen curl erroneously report a certificate error when in fact there was some sort of other issue in play, but I will trust your assertion that this is in fact not a certificate problem.

I thought at first that your argument to filters was incorrect, becauseaccording to the API reference, the filters parameter is...

a JSON encoded value of the filters (a map[string][]string) to process on the containers list.

I wasn't exactly sure how to interpret map[string][]string, so I set up a logging proxy between my Docker client and server and ran docker ps -f status=exited, which produced the following request:

GET /v1.24/containers/json?filters=%7B%22status%22%3A%7B%22exited%22%3Atrue%7D%7D HTTP/1.1\r

If we decode the argument to filters, we see that it is:

{"status":{"exited":true}}

Whereas you are passing:

{"status":["exited"]}

So that's different, obviously, and I was assuming that was the source of the problem...but when trying to verify that, I ran into a curious problem. I can't even run your curl command line as written, because curl tries to perform some globbing behavior due to the braces:

$ curl http://localhost:2376/containers/json'?filters={%22status%22:[%22exited%22]}'curl: (3) [globbing] nested brace in column 67

If I correctly quote your arguments to filter:

$ python -c 'import urllib; print urllib.quote("""{"status":["exited"]}""")'%7B%22status%22%3A%5B%22exited%22%5D%7D

It seems to work just fine:

$ curl http://localhost:2376/containers/json'?filters=%7B%22status%22%3A%5B%22exited%22%5D%7D'[{"Id":...

I can get the same behavior if I use your original expression and pass -g (aka --globoff) to disable the brace expansion:

$ curl -g http://localhost:2376/containers/json'?filters={%22status%22:[%22exited%22]}'[{"Id":...

One thing I would like to emphasize is the utility of sticking a proxy between the docker client and server. If you ever find yourself asking, "how do I use this API?", an excellent answer is to see exactly what the Docker client is doing in the same situation.


You can create a logging proxy using socat. Here is an example.

docker run -v /var/run/docker.sock:/var/run/docker.sock -p 127.0.0.1:1234:1234 bobrik/socat -v TCP-LISTEN:1234,fork UNIX-CONNECT:/var/run/docker.sock

Then run a command like so in another window.

docker -H localhost:1234 run --rm -p 2222:2222  hello-world

This example uses docker on ubuntu.


A docker REST proxy can be simple like this:

https://github.com/laoshanxi/app-mesh/blob/main/src/sdk/docker/docker-rest.go

Then you can curl like this:

curl -g http://127.0.0.1:6058/containers/json'?filters={%22name%22:[%22jenkins%22]}'