Docker Swarm Inspect 从每个节点获取内部 IP

Mig*_*jas 5 parsing docker docker-swarm

我正在尝试从全局部署在多个 swarm 节点上的服务获取内部(容器级别)IP。

与此类似的东西。

docker node ls -q | xargs docker node inspect -f '{{ .ID }} [{{ .Description.Hostname }}]: {{ .Spec.Labels }} {{ .Status.Addr  }}'
Run Code Online (Sandbox Code Playgroud)

这将返回每个节点的主机 IP 以及这些主机上的标签。

我开始使用以下命令检索所有节点上特定服务的所有 ID:

docker service ps [swarm_task] -q
Run Code Online (Sandbox Code Playgroud)

然后像这样检查每一个:

docker service ps [swarm_task] -q | xargs docker inspect -f '{{ .NetworksAttachments.Addresses }}'
Run Code Online (Sandbox Code Playgroud)

但 IP 地址的格式不同,我收到此错误:

Template parsing error: template: :1:23: executing "" at <.NetworksAttachments...>: can't evaluate field Addresses in type interface {}

检查内部的格式是这样的:

"Addresses": [
                "10.0.0.187/24"
            ]
Run Code Online (Sandbox Code Playgroud)

Fra*_*rel 6

docker 的参数--format是标准的 go文本/模板表达式。

由于NetworksAttachments是数组,您可能必须迭代NetworksAttachments才能获得有效的输出。

range关键字的设计目的是:

$ docker service ps [swarm service name] -q --filter "desired-state=Running" \
| xargs docker inspect --format '{{range .NetworksAttachments}}{{.Addresses}}{{end}}'
Run Code Online (Sandbox Code Playgroud)

我的 Docker 引擎输出是:

[10.x.x.y/16]
[10.x.x.z/16]
Run Code Online (Sandbox Code Playgroud)

我添加了--filter "desired-state=Running"todocker service ps仅专注于运行容器。

可以参考Go文本/模板文档:

{{范围管道}} T1 {{end}}

管道的值必须是数组、切片、映射或通道。如果管道的值长度为零,则不输出任何内容;否则,将 dot 设置为数组、切片或映射的连续元素,并执行 T1。如果值是映射并且键是具有定义顺序(“可比较”)的基本类型,则将按排序键顺序访问元素。