Docker API不能应用jsonfilter

根据https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#/list-tasks ,filter只能用于获取具有特定服务名称的运行容器。 出于某种原因,我收到了所有任务的完整列表,不pipe他们的姓名或期望的状态如何。 我找不到使用Docker API的JSON请求使用curl的任何适当的例子。 我正在使用以下命令:

一个)

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远程API筛选器退出工作

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

这个返回“curl:(60)Peer的证书颁发者不被识别”,所以我猜curl请求是畸形的。

我已经问了Docker论坛,他们帮了一些。 我惊讶于互联网上的任何地方都没有适当的文档来说明如何使用Docker API,或者它是如此明显,我不明白的东西?

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

我首先想到你的filters的参数是不正确的,因为根据API的参考 , filters参数是…

在容器列表上处理的filter(一个map [string] [] string)的JSON编码值。

我不是很确定如何解释map[string][]string ,所以我在我的Docker客户端和服务器之间build立了一个日志代理,运行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试图通过大括号来执行一些globbing行为:

 $ 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":... 

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

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

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