`

奇妙的 Docker Inspect 模版

 
阅读更多

docker inspect

简单地说, -f 的实参是个 Go 模版

下面让我们来进一步看看 Go 模版的奇妙之处,例如我们可以通过模版来查找所有退出码为非 0 的容器名:

$ docker inspect -f '{{if ne 0.0 .State.ExitCode }}{{.Name}} {{.State.ExitCode}}{{ end }}' $(docker ps -aq)

/tender_colden 1
/clever_mcclintock 126

/grave_bartik 1

(无论是否匹配到,对于每个容器都会输出一行)

或者在 jenkins-data 容器中查找卷  /var/jenkins_home 对应在 host 的目录:

docker inspect -f '{{index .Volumes "/var/jenkins_home"}}' jenkins-data
/var/lib/docker/vfs/dir/5a6f7b306b96af38723fc4d31def1cc515a0d75c785f3462482f60b730533b1a

上面的例子可能稍微有点难理解,不过没关系,我们先来了解一下 Go 模版的基本用法。

模版指令

{{ }} 语法用于处理模版指令,大括号外的任何字符都将直接输出。

上下文

“.” 表示“当前上下文”。大多数情况下表示了容器元数据的整个数据结构,但在某些情况下可以重新规定上下文,比如使用 with 函数:

$ docker inspect -f '{{.State.Pid}}' jenkins
6331
$ docker inspect -f '{{with .State}} {{.Pid}} {{end}}' jenkins
6331

可以使用 $ 来获取根上下文,例如:

$ docker inspect -f '{{with .State}} {{$.Name}} has pid {{.Pid}} {{end}}' jenkins
 /jenkins has pid 6331

注意,单独使用 “.” 本身也是可以的,将输出未格式化的完整元数据:

$ docker inspect -f '{{.}}' jenkins
...

数据类型

inspect 数据可以由浮点数、字符串和布尔组成,可以使用 Go 模版内置函数进行比较判断。虽然 Go 模版支持整数,但目前 inspect 数据中的数值类型都是浮点数,而整数应该对于大多数场景更方便(详见该 Issue )。使用字符串时可以使用双引号。

数据中不存在的值是不可以用来比较的:

$ docker inspect -f '{{.ExecIDs}}' jenkins
<no value>
$ docker inspect -f '{{eq .ExecIDs .ExecIDs}}' jenkins
FATA[0000] template: :1:2: executing "" at <eq .ExecIDs .ExecIDs>: error calling eq: invalid type for comparison

数据结构

inspect 数据使用 map 以及数组保存。Map 结构非常简单,前面我们曾经展示过,可以通过 . 的链式来访问 map 内部数据:

$ docker inspect -f '{{.State.ExitCode}}' jenkins
0

不过有些情况(比如 map 的键不是字符串)是不能直接使用 . 方式来获取 map 值的,此时我们可以使用 index 函数,前面卷的例子可以这样写:

docker inspect -f '{{index .Volumes "/var/jenkins_home"}}' jenkins-data
/var/lib/docker/vfs/dir/5a6f7b306b96af38723fc4d31def1cc515a0d75c785f3462482f60b730533b1a

我们也可以使用  index 来获取指定下标的数组值:

$ docker inspect -f '{{.HostConfig.Binds}}' jenkins
[/var/run/docker.sock:/var/run/docker.sock /usr/bin/docker:/usr/bin/docker]
$ docker inspect -f '{{index .HostConfig.Binds 1}}' jenkins
/usr/bin/docker:/usr/bin/docker

函数

除了 index 函数,其他很多函数也很常用。比如逻辑函数 and 、 or 可以返回布尔结果。注意,函数是不能放在中间:

$ docker inspect -f '{{and true true}}' jenkins
true

而不是:

$ docker inspect -f '{{true and true}}' jenkins
FATA[0000] template: :1:2: executing "" at <true>: can't give argument to non-function true

下面是一些常用的比较函数:

  • eq (等于)
  • ne (不等于)
  • lt (小于)
  • le (小于等于)
  • gt (大于)
  • ge (大于等于)

我们可以用这些函数来比较字符串、浮点数或整数:

$ docker inspect -f '{{eq "abc" "abc"}}' jenkins
true
$ docker inspect -f '{{ge 1 -1}}' jenkins
true
$ docker inspect -f '{{lt 4.5 4.6}}' jenkins
true
$ docker inspect -f '{{ne 4.5 4.5}}' jenkins
false

要注意的是操作数类型必须匹配,数字比较时使用浮点数:

$ docker inspect -f '{{eq "4.5" 4.5}}' jenkins
FATA[0000] template: :1:2: executing "" at <eq "4.5" 4.5>: error calling eq: incompatible types for comparison
$ docker inspect -f '{{gt .State.Pid 1}}' jenkins
FATA[0000] template: :1:2: executing "" at <gt .State.Pid 1>: error calling gt: incompatible types for comparison 
$ docker inspect -f '{{gt .State.Pid 1.0}}' jenkins
true

另外,可以使用 json 函数来生成 JSON 输出:

$ docker inspect -f '{{json .NetworkSettings.Ports}}' jenkins
{"50000/tcp":null,"8080/tcp":[{"HostIp":"0.0.0.0","HostPort":"8080"}]}

我们也可以使用 jq 工具来组合结果:

$ docker inspect -f '{{json .State}}' jenkins-data | jq '.StartedAt'
"2015-03-15T20:26:30.526796706Z"

当然, docker inspect 的默认输出结果就是 JSON,所以下面这样也可以:

$ docker inspect jenkins-data | jq '.[] | .State.StartedAt'
"2015-03-15T20:26:30.526796706Z"

更多函数请参考 Go 官方文档 ,不过很奇怪的是官方文档中并没有描述 json 函数(我是从 Nathan LeClaire’s blog 中学到的),你如果知道其中原因,记得告诉我!

If 语句

条件语句 if 可以和前面的比较函数一起使用:

$ docker inspect -f '{{if eq .State.ExitCode 0.0}} 
Normal Exit
{{else if eq .State.ExitCode 1.0}} 
Not a Normal Exit 
{{else}} 
Still Not a Normal Exit 
{{end}}' jenkins

Normal Exit

注意, {{end}} 语句必须有, else if 和 else 按需使用。

结论

我想本文应该涵盖了 docker inspect -f 使用模版时的大部分内容,不过另外还有一些很常用的特性,比如使用  range 来迭代数据、自定义函数、使用管道等需要你来自己摸索实践。

分享到:
评论

相关推荐

    zabbix监控docker模板

    这个是zabbix监控docker的模板,支持主动和被动模式,使用方法见博文https://blog.csdn.net/qq_36961530/article/details/80448301

    docker inspect 命令使用技巧

    主要介绍了docker inspect 命令使用技巧,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Docker基本命令.docx

    Docker基本命令 将tocker加到用户组 sudo groupadd docker //将docker加到用户组 sudo gpasswd -a rocky docker //将rockyyoghurt添加到docker sudo service docker ...docker inspect 容器名 查看容器的详细信息

    docker基本命令.docx

    Docker inspect 容器的id 或者是自定义名称 Docker inspect web Docker inspect 容器的id 自定义命名容器 Docker run --name=web -it ununtu:12.04 /bin/bash --name命名参数 重启停止容器,及删除容器 ...

    docker-compose-files, 一些典型的Docker 组合模板.zip

    docker-compose-files, 一些典型的Docker 组合模板 Docker 编写文件一些典型的Docker 组合示例。如果你不熟悉 Docker,可以查看以下书籍( 在 CN ):Docker 练习安装 docker& Docker组件$ curl -sSL http

    riddler:将docker inspect转换为opencontainers runc规范的工具

    将 docker inspect转换为和。 目录 注意 该项目不再维护。 如果您使用的/var/run/docker/libcontainerd版本大于1.11,则可以像这样从/var/run/docker/libcontainerd复制配置: $ docker ps -a CONTAINER ID ...

    pve7 debian11 docker容器克隆模板

    这个是自己在pve7下debian11配置好的docker模板,有需要的小伙伴自取,不当之处请指正。 上传到/var/lib/vz/dump文件夹下,web端local-备份-还原。这个模板无法启动,因为这会修改磁盘映像。如果要更改模板,请创建...

    docker-clone:基于 Docker inspect 克隆 docker 容器

    docker-clone 用于创建 Docker 容器克隆的小命令行程序。 用例: 您的主机上运行了一个容器并且它已正确配置 您想像这样运行另一个容器,但要避免名称/端口绑定冲突以及具有相同(或不同)的环境变量、卷和资源...

    docker-image-policy:根据策略文件快速验证检查的Docker映像

    $ docker inspect ubuntu:18.04 | docker run -i bryanlatten/docker-image-policy 通过运行,使用默认策略 docker inspect ubuntu:18.04 | docker run -i bryanlatten/docker-image-policy Scanning &lt;8672b25e...

    增加docker端口映射的python脚本

    docker inspect centos7 | grep 'HostnamePath' | sed 's:/hostname::g' 2、进入上述找到的目录,并把本文件拷贝到该目录 3、关闭docker服务(注意不是关闭一个容器,而是关闭整个docker服务) systemctl ...

    docker-consul-template:Docker领事模板

    Docker领事模板可用模板nginx.ctmpl可用版本0.11(docker标签: 0.11 0.11-dockerinside-1.10 0.11-dockerinside-1.11 ) 0.12(搬运工标签: 0.12 , 0.12-dockerinside-1.10 , 0.12-dockerinside-1.11 ) 0.19...

    docker-compose.yml模板

    docker-compose.yml模板,里面包含了redis\mysql\opentsdb\grafana\minio使用docker部署的配置.

    docker-monitoring_rev1.json

    docker-monitoring_rev1.json

    详解如何获取docker容器(container)的ip地址

    docker inspect --format '{{ .NetworkSettings.IPAddress }}' &lt;container&gt; 或 docker inspect 或 docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id ...

    Laravel-Docker-Template:Laravel 应用程序的 Docker 撰写模板

    Laravel Docker模板用于快速 Laravel/PHP 开发的 Docker Compose 模板。 Linux、OS X 和 Windows 友好。 这个 Docker 模板也适用于任何其他 PHP 项目,您可以根据需要随意修改 Docker 配置。包含的服务nginx ...

    docker入门ppt学习

    docker入门ppt学习

    docker-templates:unRAID Docker模板

    码头工人模板unRAID Docker模板

    docker:Lista de comandos码头工人

    Comandos码头工人Uma lista com alguns comandos do docker para o dia a dia :)Manupulando容器docker ps -a Lista容器docker docker ps Lista待办事项os容器emexecução docker inspect &lt;NOME&gt; NOME docker ...

    Docker 包Docker 包Docker 包Docker 包Docker 包Docker 包Docker 包

    Docker 包Docker 包Docker 包Docker 包Docker 包Docker 包Docker 包Docker 包Docker 包Docker 包Docker 包Docker 包Docker 包Docker 包Docker 包Docker 包Docker 包Docker 包Docker 包Docker 包Docker 包Docker 包...

Global site tag (gtag.js) - Google Analytics