docker 使用jq按名称访问数组列表项

nwsw7zdq  于 2023-11-17  发布在  Docker
关注(0)|答案(3)|浏览(81)

考虑以下json数据,来自Docker镜像nginx:1.25-bookworm

# docker pull nginx:1.25-bookworm
# docker image inspect 81be38025439 | jq '.[].Config.Env'
[
  "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
  "NGINX_VERSION=1.25.3",
  "NJS_VERSION=0.8.2",
  "PKG_RELEASE=1~bookworm"
]
#

字符串
我希望能够从这个列表中访问'1.25.3',以标记CI-CD管道构建步骤中的图像。
我已经接近我的目标,如下:

# docker image inspect 0743972990c7 | jq -r '.[].Config.Env[1]'
NGINX_VERSION=1.23.4


但是想知道如何通过名称访问项目'NGINX_VERSION',而不是依赖于它将是第二个环境变量的假设。

chhkpiq4

chhkpiq41#

所以从数组中过滤NGINX_VERSION并删除它。

.[].Config.Env |
select(startswith("NGINX_VERSION=")) |
sub("^NGINX_VERSION="; "")

字符串

oxf4rvwz

oxf4rvwz2#

对于给定的任务,我也会使用startswith,如KamilCuk's answer中所述。但是如果你需要访问多个值,你可能需要考虑使用INDEX创建一个查找对象:

INDEX(.[:index("=")]) as $ix   # stores {"PATH": … , "NGINX_VERSION": … , …}

字符串
然后按字段名访问值(截断第一个=字符的index位置):

| $ix["NGINX_VERSION"]         # yields "NGINX_VERSION=1.25.3"
| .[index("=")+1:]             # yields "1.25.3


Demo

mitkmikd

mitkmikd3#

下面是一个有用的函数,用于将key<DELIM>value形式的字符串数组转换为JSON对象:

# input: an array of strings of the form: key + delim + value
# It is assumed that delim is string with a single character that 
# is not special in the context of regular expressions.
def toObject(delim): 
  map( capture("(?<key>[^" + delim + "]*)" + delim + "(?<value>.*)" )) | from_entries;

字符串
然后,所述问题的解决方案可以写为:

toObject("=") | .NGINX_VERSION

相关问题