lian2

发布时间 2023-04-09 21:00:08作者: 坑坑尔不坑

这个https://www.cnblogs.com/6262lonely/articles/11119625.html里收集了在kt工作时遇到问题后查找的一些链接。那时的自己,问题解决了就行,未将每一个问题仔细整理。在魔兽世界吧里面看到了几篇很老的帖子,那时的网友大部分还是很可爱。这一篇只能是杂记了……

看到了一个运维开发的博客,看到了docker inspect --format这篇。

https://www.escapelife.site/posts/8bf741fb.html#toc-heading-2

之前看和k8s有关的视频的时候,看到docker inspect --format这块,只是用了下。后面的工作中就用如下格式了:

1 docker inspect containerID | grep -i network

docker inspect 输出的是json格式的数据,而docker inspect --format则使用给定的Go模板格式化输出。

1 -f, --format string   Format the output using the given Go template

JSON中的数据类型:(插入的是Python格式的,需要现在前面加#号)

# number:和JavaScript的number完全一致;
# boolean:就是JavaScript的true或false;
# string:就是JavaScript的string;
# null:就是JavaScript的null;
# array:就是JavaScript的Array表示方式——[];
# object:就是JavaScript的{ ... }表示方式。

并且,JSON还定死了字符集必须是UTF-8,表示多语言就没有问题了。为了统一解析,JSON的字符串规定必须用双引号"",Object的键也必须用双引号""。

参考:https://www.liaoxuefeng.com/wiki/1022910821149312/1023021554858080

Go模板语法:

1 # 输出文本:{{ . }},其中 . 表示当前的数据对象。
2 # 输出变量:{{ .variable }},其中 variable 表示要输出的变量名。
3 # 输出变量的某个字段:{{ .variable.field }},其中 field 表示要输出的字段名。
4 # 条件判断:{{ if condition }} ... {{ end }},其中 condition 表示要判断的条件,如果条件成立,会执行 ... 中的代码。
5 # 条件判断和 else:{{ if condition }} ... {{ else }} ... {{ end }},其中 else 表示条件不成立时要执行的代码。
6 # 循环:{{ range array }} ... {{ end }},其中 array 表示要循环的数组或切片,... 中的代码会对数组或切片中的每个元素进行渲染。
7 # 变量赋值:{{ $variable := value }},其中 variable 表示要赋值的变量名,value 表示要赋给变量的值。
8 # 模板嵌套:{{ template "name" . }},其中 name 表示要嵌套的模板名称,. 表示要传递给模板的数据对象。
9 # 函数调用:{{ function parameter }},其中 function 表示要调用的函数名,parameter 表示要传递给函数的参数。

ChatGPT给的答案。

Go官方:https://golang.org/pkg/text/template/

docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "bec9bbf537fd27653663bb7e8da59945280f4d60a48b6eb9f2094507eca56ecb",
        "Created": "2023-04-08T09:35:40.370935879+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "0d12098b1009edcdeb1a7e3d124a124e0d20bc16aa480f64212fac1e6096a97d": {
                "Name": "inspiring_curie",
                "EndpointID": "a3dadd39d62010ebb1a0e4f32687033780156e385f462b3ee6734a6c36b05155",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "fccb368b8e7d4b50c66c8057bf344fad049f17d3f46415a97b6c79cd30473671": {
                "Name": "ecstatic_dijkstra",
                "EndpointID": "525ebea7378729afd888c5e62f77ea2af0e4744fc848b7d24a7bdbfe9bb708bd",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]
`点号表示当前对象及上下文,和 JavaC++ 中的 this 类似,可以直接通过点来获取当前对象。另外,如果返回结果也是一个 Struct 对象(Json 中以花括号/大括号包含),则可以直接通过点号级联调用,获取子对象的指定属性值。`
[root@k8s-rancher ~]# docker network inspect -f '{{.Name}}' bridge bridge
`如果需要获取的属性名称包含点号(比如下列示例数据)或者以数字开头,则不能直接通过级联调用获取信息。因为属性名称中的点号会被解析成级联信息,进而导致返回错误结果。即便使用引号将其包含也会提示语法格式错误。此时,需要通过 index 来读取指定属性信息。`
`index是Go语言的内置函数,用于获取一个数组或切片(.Options)中指定索引位置(
com.docker.network.bridge.name)的元素。`
[root@k8s-rancher ~]# docker inspect -f '{{/*读取网络在hosts上的名称*/}}{{index .Options "com.docker.network.bridge.name"}}' bridge
docker0
# 自定义变量
[root@k8s-rancher ~]# docker inspect -f '{{println}}{{range $p,$conf := .NetworkSettings.Ports}}{{$p}} -> {{(index $conf 0).HostPort}}{{println}}{{end}}' fcc

  443/tcp -> 443
  80/tcp -> 80

 # range

  [root@k8s-rancher ~]# docker inspect --format '{{range .Containers}}{{.Name}}{{println}}{{else}}With No Containers{{end}}' bridge
  inspiring_curie
  ecstatic_dijkstra

  [root@k8s-rancher ~]# docker inspect --format '{{range .Containers}}{{.Name}}{{println}}{{else}}With No Containers{{end}}' none
  With No Containers

  # index(Config属性一个Map)

  [root@k8s-rancher ~]# docker inspect bridge -f '{{(index .IPAM.Config 0).Gateway}}'
  172.17.0.1

  [root@k8s-rancher ~]# docker inspect bridge -f '{{(index .IPAM.Config 0).Subnet}}'
  172.17.0.0/16

  # else

  1)not

  [root@k8s-rancher ~]# docker inspect -f '{{if not .State.Restarting}}容器没有配置重启策略{{end}}' $(docker ps -q)