Docker API 无法应用 json 过滤器
Docker API can’t apply json filters
根据 https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#/list-tasks,过滤器只能用于获取 运行 具有特定服务名称的容器。出于某种原因,我得到了所有任务的完整列表,无论它们的名称或所需状态如何。我找不到任何将 curl 与 JSON 请求和 Docker API 一起使用的适当示例。
我正在使用以下命令:
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
Returns一切
B)
试图从
获得一些东西
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
这个 returns "curl: (60) Peer's Certificate issuer is not recognized.",所以我猜 curl 请求格式不正确。
我在 Docker 论坛上问过,他们提供了一些帮助。我很惊讶互联网上没有任何关于如何将 Docker API 与 curl 一起使用的适当文档,或者它是如此明显而我不明白什么?
我应该在前面加上这样一个事实,即我从未见过 curl 错误地报告证书错误,而实际上存在某种其他问题,但我相信你关于这实际上不是证书的断言问题。
起初我以为你对 filters
的论点是不正确的,因为
根据 API reference,filters
参数是...
a JSON encoded value of the filters (a map[string][]string) to process on the containers list.
我不确定如何解释 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 客户端和服务器之间粘贴代理的实用程序。如果你发现自己在问 "how do I use this API?",一个很好的答案是看看 Docker 客户在相同情况下到底在做什么。
您可以使用 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
然后 运行 在另一个 window.
中这样的命令
docker -H localhost:1234 run --rm -p 2222:2222 hello-world
此示例在 ubuntu 上使用 docker。
一个docker REST代理可以像这样简单:
https://github.com/laoshanxi/app-mesh/blob/main/src/sdk/docker/docker-rest.go
然后你可以这样卷曲:
curl -g http://127.0.0.1:6058/containers/json'?filters={%22name%22:[%22jenkins%22]}'
根据 https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#/list-tasks,过滤器只能用于获取 运行 具有特定服务名称的容器。出于某种原因,我得到了所有任务的完整列表,无论它们的名称或所需状态如何。我找不到任何将 curl 与 JSON 请求和 Docker API 一起使用的适当示例。 我正在使用以下命令:
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
Returns一切
B)
试图从
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
这个 returns "curl: (60) Peer's Certificate issuer is not recognized.",所以我猜 curl 请求格式不正确。
我在 Docker 论坛上问过,他们提供了一些帮助。我很惊讶互联网上没有任何关于如何将 Docker API 与 curl 一起使用的适当文档,或者它是如此明显而我不明白什么?
我应该在前面加上这样一个事实,即我从未见过 curl 错误地报告证书错误,而实际上存在某种其他问题,但我相信你关于这实际上不是证书的断言问题。
起初我以为你对 filters
的论点是不正确的,因为
根据 API reference,filters
参数是...
a JSON encoded value of the filters (a map[string][]string) to process on the containers list.
我不确定如何解释 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 客户端和服务器之间粘贴代理的实用程序。如果你发现自己在问 "how do I use this API?",一个很好的答案是看看 Docker 客户在相同情况下到底在做什么。
您可以使用 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
然后 运行 在另一个 window.
中这样的命令docker -H localhost:1234 run --rm -p 2222:2222 hello-world
此示例在 ubuntu 上使用 docker。
一个docker REST代理可以像这样简单:
https://github.com/laoshanxi/app-mesh/blob/main/src/sdk/docker/docker-rest.go
然后你可以这样卷曲:
curl -g http://127.0.0.1:6058/containers/json'?filters={%22name%22:[%22jenkins%22]}'