代码之家  ›  专栏  ›  技术社区  ›  Miguel Callejas

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

  •  3
  • Miguel Callejas  · 技术社区  · 8 年前

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

    类似的东西。

    docker node ls -q | xargs docker node inspect -f '{{ .ID }} [{{ .Description.Hostname }}]: {{ .Spec.Labels }} {{ .Status.Addr  }}'
    

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

    我开始检索所有节点上特定服务的所有ID,使用:

    docker service ps [swarm_task] -q
    

    然后像这样检查每一个:

    docker service ps [swarm_task] -q | xargs docker inspect -f '{{ .NetworksAttachments.Addresses }}'
    

    但IP地址的格式不同,我得到以下错误:

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

    inspect内的格式如下:

    "Addresses": [
                    "10.0.0.187/24"
                ]
    
    1 回复  |  直到 8 年前
        1
  •  4
  •   François Maturel smsnheck    8 年前

    docker的论点 --format 是标准go text/template 表示

    NetworksAttachments 是一个数组,您可能需要迭代 网络附件 获取有效输出。

    这个 range 关键字的设计目的是:

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

    我的docker引擎输出为:

    [10.x.x.y/16]
    [10.x.x.z/16]
    

    我添加了 --filter "desired-state=Running" docker service ps 只关注运行容器。

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

    {{范围管道}}T1{{结束}}

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

    推荐文章