如何在(私有)Docker注册表(API v2)中查找图像的创建日期?

snt*_*nth 11 docker docker-registry

我想使用v2 API找到私有Docker注册表中图像的最新时间戳,而不先将图像拉到我的本地主机.

snt*_*nth 18

所以经过一些黑客攻击,我得到以下工作使用curljq工具:

curl -X GET http://registry:5000/v2/<IMAGE>/manifests/<TAG> \
    | jq -r '.history[].v1Compatibility' \
    | jq '.created' \
    | sort \
    | tail -n1
Run Code Online (Sandbox Code Playgroud)

这似乎工作,但我真的不知道如何解释v1兼容性表示,所以我不知道我是否真正得到正确的数字.

对此的评论是受欢迎的!

  • 糟糕,忘了相反:`jq -r'[.history []] | map(.v1Compatibility | fromjson | .created)| sort | reverse |.[0] (2认同)

nat*_*a_m 6

使用V2 图像清单(架构版本 2),响应http://registry:5000/v2/<IMAGE>/manifests/<TAG>不包含“历史记录”字段,并且我还没有找到一种方法来在一个请求中检索图像创建日期。但是,可以根据图像清单配置的摘要使用另一个请求来获取它。

首先,获取配置的摘要(注意指定架构版本的标头):

digest=$(curl -H 'Accept: application/vnd.docker.distribution.manifest.v2+json' \
 http://registry:5000/v2/<IMAGE>/manifests/<TAG> \
 | jq -r '.config.digest')
Run Code Online (Sandbox Code Playgroud)

的值digest将类似于 sha256:ec4b8955958665577945c89419d1af06b5f7636b4ac3da7f12184802ad867736

然后,获取摘要标识的对象的 blob,即容器的配置对象,并从那里检索创建日期:

curl -H 'Accept: application/vnd.docker.distribution.manifest.v2+json' \
  http://registry:5000/v2/<IMAGE>/blobs/$digest | jq -r '.created'
Run Code Online (Sandbox Code Playgroud)

这应该产生:

2021-10-27T12:18:24.105617451Z
Run Code Online (Sandbox Code Playgroud)

奖励:使用 skopeo 获取创建日期

我不确定上述方法是否是唯一或最好的方法,但顺便说一句,这显然或多或少是skopeo在运行时在幕后所做的事情:

skopeo inspect docker://registry:5000/<IMAGE>:<TAG>
Run Code Online (Sandbox Code Playgroud)

上面的命令返回有关图像标签的信息,其中包括创建日期:

{
  "Name": "registry:5000/<IMAGE>",
  "Digest": "sha256:655721ff613ee766a4126cb5e0d5ae81598e1b0c3bcf7017c36c4d72cb092fe9",
  "RepoTags": [...],
  "Created": "2021-10-27T12:18:24.105617451Z",
  ...
}
Run Code Online (Sandbox Code Playgroud)