例如,我有一个从 Dockerhub 中提取的
Alpine
镜像。只需使用docker pull alpine
即可。它被标记为当前日期(比如说 2019-12-12)。
所以现在我想更新图像,但首先我想在拉取之前检查 latest
或最新版本的上次更新日期。
对于本地图像,我们可以使用
docker inspect alpine:latest
。有没有任何API或命令可以完成这个任务?
就像 David 在评论中所说,
docker pull
只会拉动已更改的图层。
$ docker pull alpine:latest
latest: Pulling from library/alpine
a0d0a0d46f8b: Already exists
Digest: sha256:e1c082e3d3c45cccac829840a25941e679c25d438cc8412c2fa221cf1a824e6a
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest
$ docker pull alpine:latest
latest: Pulling from library/alpine
Digest: sha256:e1c082e3d3c45cccac829840a25941e679c25d438cc8412c2fa221cf1a824e6a
Status: Image is up to date for alpine:latest
docker.io/library/alpine:latest
事实上,从输出中,您可以看到它检查清单列表的摘要,所以我不相信它甚至在第二个查询上提取清单,它可以通过简单的头请求进行检查。至于为什么第一次拉取时提到
a0d0a0d46f8b: Already exists
,如果拉取另一个基于该 Alpine 图像的图像,那么底层就已经被检索到了。
如果您确实想直接从注册表检查数据而不提取映像和图层,可以使用多种工具来实现。我知道的包括 RedHat 的 skopeo、Google 的起重机(go-containerregistry 的一部分),我开发了一个 regclient 项目,其中包括
regctl
: 之类的命令
$ regctl image digest --list alpine:latest
sha256:e1c082e3d3c45cccac829840a25941e679c25d438cc8412c2fa221cf1a824e6a
您可以将其与 docker 在图像中看到的内容进行比较:
$ docker image inspect alpine:latest --format '{{.RepoDigests}}'
[alpine@sha256:e1c082e3d3c45cccac829840a25941e679c25d438cc8412c2fa221cf1a824e6a]
它还允许您在不下载图层的情况下检查图像配置:
$ regctl image config alpine:latest
{
"created": "2021-08-27T17:19:45.758611523Z",
"architecture": "amd64",
"os": "linux",
"config": {
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh"
]
},
"rootfs": {
"type": "layers",
"diff_ids": [
"sha256:e2eb06d8af8218cfec8210147357a68b7e13f7c485b991c288c2d01dc228bb68"
]
},
"history": [
{
"created": "2021-08-27T17:19:45.553092363Z",
"created_by": "/bin/sh -c #(nop) ADD file:aad4290d27580cc1a094ffaf98c3ca2fc5d699fe695dfb8e6e9fac20f1129450 in / "
},
{
"created": "2021-08-27T17:19:45.758611523Z",
"created_by": "/bin/sh -c #(nop) CMD [\"/bin/sh\"]",
"empty_layer": true
}
]
}
使用 v2 清单格式,现在可以通过以下方式完成:
docker manifest inspect -v <image>
“docker manifest”命令被视为“实验性”命令,API 可能会在未来版本中发生变化。
https://docs.docker.com/reference/cli/docker/manifest/inspect/