【问题标题】:Docker API can’t apply json filtersDocker API 无法应用 json 过滤器
【发布时间】:2017-02-19 23:04:51
【问题描述】:

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

一)

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

这个返回“curl: (60) Peer's Certificate issuer is not recognize.”,所以我猜 curl 请求格式不正确。

我在 Docker 论坛上询问过,他们提供了一些帮助。令我惊讶的是,互联网上没有任何适当的文档说明如何将 Docker API 与 curl 一起使用,或者它是如此明显而我什么都不懂?

【问题讨论】:

  • 您收到证书错误。如果只是在 curl 命令行中添加 -k 会导致 curl 接受未知证书怎么办?这能解决问题吗?该问题的答案可能有助于确定您需要在哪里寻找解决方案。
  • ** 证书不是问题,如果我不使用过滤器,我可以卷曲所需的信息。 p.s.添加 -k 什么都不做

标签: json curl docker docker-api


【解决方案1】:

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]}'

【讨论】:

    【解决方案2】:

    您可以使用 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。

    【讨论】:

      【解决方案3】:

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

      一开始我以为你对filters 的论点是不正确的,因为 根据API referencefilters参数是……

      要在容器列表上处理的过滤器的 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 客户端在相同情况下正在做什么。

      【讨论】:

      • 您能分享一下如何为此设置日志代理吗?
      • 我觉得这里缺少一些重要的东西:文档不包括“状态”作为“可用过滤器”之一。有没有关于这些过滤器的更完整的文档,或者你们只是在尝试过滤器并发现它有效?
      • Filtering 手册的docker ps 部分显示了status关键字。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多