Sto*_*bor 3 json curl docker docker-api
根据https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#/list-tasks,过滤器只能用于获取具有特定服务名称的正在运行的容器。由于某种原因,我得到了所有任务的完整列表,无论其名称或所需状态如何。我找不到任何使用带有 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
Run Code Online (Sandbox Code Playgroud)
返回所有内容
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
Run Code Online (Sandbox Code Playgroud)
这个返回“curl:(60)无法识别对等方的证书颁发者。”,所以我猜测curl请求格式错误。
我在 Docker 论坛上询问过,他们提供了一些帮助。我很惊讶互联网上没有任何关于如何将 Docker API 与curl 一起使用的正确文档,或者它是如此明显而我不明白什么?
我应该以此为前缀,即我从未见过curl 在出现某种其他问题时错误地报告证书错误,但我会相信您的断言,这不是证书问题。
我一开始以为你的参数是filters
不正确的,因为根据API 参考,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
Run Code Online (Sandbox Code Playgroud)
如果我们将参数解码为filters
,我们会看到它是:
{"status":{"exited":true}}
Run Code Online (Sandbox Code Playgroud)
而你正在通过:
{"status":["exited"]}
Run Code Online (Sandbox Code Playgroud)
显然,这是不同的,我假设这是问题的根源......但是当试图验证这一点时,我遇到了一个奇怪的问题。我什至无法按照curl
编写的方式运行命令行,因为由于大括号,curl 尝试执行一些通配行为:
$ curl http://localhost:2376/containers/json'?filters={%22status%22:[%22exited%22]}'
curl: (3) [globbing] nested brace in column 67
Run Code Online (Sandbox Code Playgroud)
如果我正确引用你的参数来过滤:
$ python -c 'import urllib; print urllib.quote("""{"status":["exited"]}""")'
%7B%22status%22%3A%5B%22exited%22%5D%7D
Run Code Online (Sandbox Code Playgroud)
它似乎工作得很好:
$ curl http://localhost:2376/containers/json'?filters=%7B%22status%22%3A%5B%22exited%22%5D%7D'
[{"Id":...
Run Code Online (Sandbox Code Playgroud)
-g
如果我使用原始表达式并传递(又名--globoff
)来禁用大括号扩展,我可以获得相同的行为:
$ curl -g http://localhost:2376/containers/json'?filters={%22status%22:[%22exited%22]}'
[{"Id":...
Run Code Online (Sandbox Code Playgroud)
我想强调的一件事是在 docker 客户端和服务器之间添加代理的实用性。如果您发现自己问“我如何使用这个 API?”,一个很好的答案是查看 Docker 客户端在相同情况下到底做了什么。
设置一个简单的日志代理:
socat -v tcp-listen:2376,fork,reuseaddr unix-connect:/run/docker.sock
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3402 次 |
最近记录: |