docker inspect:如何从范围中仅选择特定的键

3

我创建了一个Docker镜像,其中有几个标签,这是我的Dockerfile文件中的LABELS部分:

grep LABEL Dockerfile

LABEL "css1"="/var/www/css1"
LABEL "css2"="/var/www/css2"
LABEL "img"="/var/www/img"
LABEL "js"="/var/www/js"

然后:

docker image inspect --format='{{.Config.Labels}}' labels-test

map[css1:/var/www/css1 css2:/var/www/css2 img:/var/www/img js:/var/www/js]

我需要获取以css开头的所有标签。这是我能想到的方法:
docker image inspect --format='{{range $k,$v:=.Config.Labels}}{{$k}}:{{$v}} {{end}}' labels-test

css1:/var/www/css1 css2:/var/www/css2 img:/var/www/img js:/var/www/js

期望的输出是:
css1:/var/www/css1 css2:/var/www/css2
2个回答

3
Go语言模板函数可在golang文档中查阅 eq 可以测试 arg1 是否等于 arg2printf "%.3s" $k 将返回字符串的前三个字符。
docker image inspect \
  --format='{{ range $k,$v:=.Config.Labels }}{{ if eq (printf "%.3s" $k) "css" }}{{ $k }}:{{ $v }} {{end}}{{end}}' \
  IMAGE

如果您需要进行更高级的处理,您可以直接查看查询Docker API 镜像端点 /images/IMAGE/json 或者在某个地方处理JSON输出:

docker image inspect \
  --format='{{json .Config.Labels}}' \
  IMAGE

这个能否以某种方式处理正则表达式? - fflost
据我所知,目前还没有这样的功能,但是我对Go并不是很了解。如果您可以访问Go代码,则可以添加自定义函数,但似乎我们只能使用Docker提供的“--format”。 - Matt
我应该如何获取匹配的条目数(例如,我的期望输出是2)? - fflost
如果您使用换行符作为分隔符,请将输出导入到 grep -cwc -l 中。另一个选项是在 if 内部添加一个递增的计数器。 - Matt

1
您可以执行以下操作:
docker inspect --format='{{index (index (.Config.Labels)).css1 }}' labels-test
这将显示:
/var/www/css1
还可以执行以下操作:
docker inspect --format='{{index (index (.Config.Labels)).css2 }}' labels-test
这将显示:
/var/www/css2
请参阅我之前关于该主题的回答 如何在执行Docker Inspect时获取ENV变量 编辑
以下内容正好符合您的要求:
docker inspect --format='{{index (index (.Config.Labels)).css1 }} {{index (index (.Config.Labels)).css2 }} labels-test'
我得到的结果是:
/var/www/css1 /var/www/css2

我一开始尝试使用索引,但无法弄清如何为css*做出示例: docker image inspect --format '{{ index .Config.Labels "css" }}' labels-test - fflost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接