Docker - 周边 - Go Template
-
概述
- docker inspect -f 引出
- 希望学会后, 可以处理这个命令
- 感觉效果不是很好, 但是不知道, 如何重构
-
问题: 这是啥
-
疑问
- 最开始, 我以为是 jsonpath
- 后来看 命令行的解释, 说叫 go template
- 但是我查了查东西, 发现这俩玩意又是那么的相似
-
结果
- 这确实是 Go Template
-
1. Go Template
-
概述
- go 语言的模板类库
-
作用
- 类似 jsp, velocty, thymeleaf
- 预先定义模板
- 然后在通过变量渲染
- 最终得出所谓的 动态页面
- 但是这里, 貌似成为了一个 json 属性获取器
- 而且还是不那么好用的那种
- 类似 jsp, velocty, thymeleaf
2. docker inspect
-
概述
- -f 参数, 支持 go template
-
作用
- 以 整个 json 为 根元素
- 通过特定的语法, 获取特定位置的值
- 以 整个 json 为 根元素
-
问题
- 也不算是问题, 但是这样显示, 确实需要适应
-
查询的结果
- 值
- 显示单个值
- 数组
- 返回数组
- 中间以 ' ' 分割
- 字典/map
- 只返回 value
- 中间以 ' ' 分割
- 混合
- 同样只返回 value
- 中间以 ' ' 分割
- 嵌套
- 还是只返回 value
- 中间以 ' ' 分割
- 值
-
我不太喜欢这种方式
- 没有 ', ' 分割
- map 没有 key
- 但是不代表, 这个不合理
- 或者说
- 这个作为 模板类库, 是合理的
- 但是作为信息检索的工具, 有点不太合适
-
这个
- 熟练就好了
- 可以想办法克服
- 后面有 json 函数
-
- 也不算是问题, 但是这样显示, 确实需要适应
3. 定位元素
-
上下文
-
概述
- json 结果的 根元素
-
格式
{{.}} {{$.}}
-
-
字段
-
概述
- 提取结果里, 某个字段的值
-
格式
# 单个值 > docker image inspect -f '{{.Id}}' ubuntu sha256:7698f282e5242af2b9d2291458d4e425c75b25b0008c1e058d66b717b4c06fa9 # 返回 字典属性 # map 没有被正确还原 > docker image inspect -f '{{.RootFS}}' ubuntu {layers [sha256:02571d034293cb241c078d7ecbf7a84b83a5df2508f11a91de26ec38eb6122f1 sha256:270f934787edf0135132b6780cead0f12ca11690c5d6a5d395e44d290912100a sha256:8d267010480fed7e616b9b7861854042aad4ef5e55f8771f2c738061640d2cb0] }
-
-
层级
-
概述
- 可以取到 json 的深层
-
格式
> docker image inspect -f '{{.RootFS.Type}}' ubuntu layers
-
-
index
-
概述
- 可以取到 json 中数组的 index
-
格式
> docker image inspect -f '{{index .RootFS.Layers 0}}' ubuntu sha256:02571d034293cb241c078d7ecbf7a84b83a5df2508f11a91de26ec38eb6122f1o # 其实也可以直接取 元素 # 字符串要加 引号 > docker image inspect -f '{{index .RootFS "Type"}}' ubuntu layers
-
4. 布尔函数
-
eq
-
概述
- 比较两个元素是否相等
- 元素类型要相等
-
格式
# 当然也可以比较 根元素下面的值 > docker image inspect -f '{{eq 1 1}}' ubuntu true
-
-
ne
-
概述
- 比较两个元素是否不等
- 元素类型要相等
-
格式
# 当然也可以比较 根元素下面的值 > docker image inspect -f '{{ne 2 1}}' ubuntu true
-
-
lt
-
概述
- 比较两个元素 a 和 b, a < b 是否成立
- 元素类型要相等
-
格式
# 当然也可以比较 根元素下面的值 > docker image inspect -f '{{lt 1 2}}' ubuntu true
-
-
le
-
概述
- 比较两个元素 a 和 b, a <= b 是否成立
- 元素类型要相等
-
格式
# 当然也可以比较 根元素下面的值 > docker image inspect -f '{{le 1 1}}' ubuntu true
-
-
gt
-
概述
- 比较两个元素 a 和 b, a > b 是否成立
- 元素类型要相等
-
格式
# 当然也可以比较 根元素下面的值 > docker image inspect -f '{{gt 2 1}}' ubuntu true
-
-
ge
-
概述
- 比较两个元素 a 和 b, a >= b 是否成立
- 元素类型要相等
-
格式
# 当然也可以比较 根元素下面的值 > docker image inspect -f '{{ge 1 1}}' ubuntu true
-
5. 打印函数
-
print
- 略
- go 的 print 函数, 我现在还没学, 学会了再补
- 略
-
printf
- 略
- go 的 print 函数, 我现在还没学, 学会了再补
- 略
-
println
- 略
- go 的 print 函数, 我现在还没学, 学会了再补
- 略
-
urlquery
- 略
- 这个真不会
- 略
-
json
-
概述
- 按 json 的格式, 展示 key 的 value
-
格式
> docker image inspect -f '{{json .RootFS}}' ubuntu {"Type":"layers","Layers":["sha256:02571d034293cb241c078d7ecbf7a84b83a5df2508f11a91de26ec38eb6122f1","sha256:270f934787edf0135132b6780cead0f12ca11690c5d6a5d395e44d290912100a","sha256:8d267010480fed7e616b9b7861854042aad4ef5e55f8771f2c738061640d2cb0"]}
-
注意
- 这个命令只能处理 {} 元素
-
-
len
-
概述
- 返回内容的长度
- 内容是 集合 时, 返回 集合长度
- 内容是 字符串 时, 返回 字符串长度
- 内容是 数字 时, 返回 字数字长度
- 返回内容的长度
-
格式
> docker image inspect -f '{{len .RootFS}}' ubuntu 2 > docker image inspect -f '{{len .RootFS.Type}}' ubuntu 6
-
6. 逻辑函数
-
and
-
概述
- 做 逻辑与
-
格式
> docker image inspect -f '{{and true true}}' ubuntu true
-
-
not
-
概述
- 做 逻辑非
-
格式
> docker image inspect -f '{{not true}}' ubuntu false
-
-
or
-
概述
- 返回内容的长度
-
格式
> docker image inspect -f '{{or true true}}' ubuntu true
-
7. 结构
-
if
- 略
-
range
- 略
-
with
- 略
8. 打印
-
概述
- 其实这个 {{}} 可以配合其他内容来打印
-
格式
# 配合 print 可以打印出各种效果 > docker image inspect -f '你好 {{len .Size}}' ubuntu 你好 8
ps
-
ref
-
- 讲得还行
- 起码是有例子, 有细节
- 基础讲得还行
- 讲得还行
-
- 函数讲得还行
-
- 给这个例子, 只是为了告诉你, go template 和 jsonpath 真的不是一个东西
-
- 更加正式的描述 go template
-
-
其他
- 结构部分 需要补上
- 打印 部分, 需要补上
-
用处
- 老实说, 感觉其实用处, 也没那么大...
尽量尝试解释清楚; 自己校对能力有限, 如果有错误欢迎指出