Docker API无法应用json过滤器

时间:2016-10-11 11:55:19

标签: json curl docker docker-api

根据https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#/list-tasks,过滤器只能用于获取具有特定服务名称的运行容器。出于某种原因,我将获得所有任务的完整列表,无论其名称或所需状态如何。我找不到任何使用curl和Docker API的JSON请求的正确示例。 我使用以下命令:

A)

curl -X GET -H "Content-Type: application/json" -d '{"filters":[{ "service":"demo", "desired-state":"running" }]}' https://HOSTNAME:2376/tasks --cert ~/.docker/cert.pem --key ~/.docker/key.pem --cacert ~/.docker/ca.pem

返回所有内容

B) 试图从Docker Remote API Filter Exited

获得一些工作
curl https://HOSTNAME:2376/containers/json?all=1&filters={%22status%22:[%22exited%22]} --cert ~/.docker/cert.pem   --key ~/.docker/key.pem   --cacert ~/.docker/ca.pem

这个返回"卷曲:(60)同行的证书发行者无法识别。",所以我猜卷曲请求格式不正确。

我在Docker论坛上问过他们帮了一下。我很惊讶互联网上没有关于如何使用卷曲的Docker API的适当文档,或者它是如此明显,我不明白的东西?

2 个答案:

答案 0 :(得分:3)

我应该在前面加上这样一个事实,即我从未见过curl错误地报告证书错误,而实际上还存在某种其他问题,但我相信你的断言这实际上不是证书问题。

我一开始认为你对filters的论证不正确,因为 根据{{​​3}},filters参数是......

  

要在容器列表上处理的过滤器的JSON编码值(map [string] [] string)。

我不确定如何解释map[string][]string,所以我在Docker客户端和服务器之间设置了一个日志代理并运行docker ps -f status=exited,这产生了以下请求:

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

如果我们将参数解码为filters,我们会看到它是:

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

你传递的是:

{"status":["exited"]}

显然,这是不同的,我认为这是问题的根源......但是当我试图验证时,我遇到了一个奇怪的问题。我甚至无法按照书面命令运行curl命令行,因为curl会因为大括号而尝试执行一些通配行为:

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

如果我正确引用你的论点来过滤:

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

似乎工作正常:

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

如果我使用原始表达式并传递-g(又名--globoff)来禁用括号扩展,我可以得到相同的行为:

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

我想强调的一点是在docker客户端和服务器之间粘贴代理的效用。如果你发现自己在问,"我该如何使用这个API?",一个很好的答案是确切地看到Docker客户端在相同的情况下正在做什么。

答案 1 :(得分:0)

您可以使用socat创建日志记录代理。这是一个例子。

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

然后在另一个窗口中运行类似的命令。

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

此示例在ubuntu上使用docker。