当前位置: 首页 > 知识库问答 >
问题:

我如何检查我的本地docker图像是否过时,而不从其他地方推?

充昌勋
2023-03-14

我正在Coreos服务器上的docker容器中运行react应用程序。假设它是从dockerhub的<代码>https://hub.docker.com/r/myimages/myapp。

现在我想定期检查应用程序容器的dockerhub映像是否已更新,以查看我在本地运行的映像是否落后。

与远程图像相比,检查本地docker图像是否过时的最有效方法是什么?到目前为止,我找到的所有解决方案都是bash脚本或推动更新的外部服务。我希望找到一种尽可能适合docker的解决方案,并且避免从其他地方推送通知(提醒服务器更新图像)。

共有3个答案

佟翰林
2023-03-14

Docker Hub有一个可用的API

您应该能够获得标签列表,以及清单详细信息

编辑

我做了一些挖掘,看起来他们没有暴露任何类型的图像校验和,它的清单或组成它的层。

我发现的最接近的是创建日期...如果你想让一些远程安全的东西,我不建议使用它。

无论如何,你需要先获得一个访问令牌

curl "https://auth.docker.io/token?service=registry.docker.io&scope=repository:library/ubuntu:pull"

从响应中提取令牌,然后可以加载图像版本的清单

curl --header "Authorization: Bearer $TOKEN" https://index.docker.io/v2/library/ubuntu/manifests/latest

查看返回的json的历史对象,您会发现一个创建的属性。

然后,您可以使用创建日期获取您的本地图像

docker inspect --format "{{json .Created}}" ubuntu:latest

比较两者并畏缩离开...

楚墨一
2023-03-14

如果您正在使用Docker Hub,您可以使用Webhook通知Docker主机更新,并对此采取行动。

使用webhook将是一种“简单”的方式(我认为),否则你将不得不在docker pull中进行某种爬行,或者正如@alebianco比较一些哈希或构建/创建日期所解释的那样。

以下是关于它的文档:https://docs.docker.com/docker-hub/webhooks/

贝嘉泽
2023-03-14

您可以查询注册表API以获取图像摘要,并将其与您提取的内容进行比较。

$ cat digest-v2.sh
#!/bin/sh

ref="${1:-library/ubuntu:latest}"
repo="${ref%:*}"
tag="${ref##*:}"
acceptM="application/vnd.docker.distribution.manifest.v2+json"
acceptML="application/vnd.docker.distribution.manifest.list.v2+json"
token=$(curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:${repo}:pull" \
        | jq -r '.token')
curl -H "Accept: ${acceptM}" \
     -H "Accept: ${acceptML}" \
     -H "Authorization: Bearer $token" \
     -I -s "https://registry-1.docker.io/v2/${repo}/manifests/${tag}"

$ ./digest-v2.sh library/busybox:latest
HTTP/1.1 200 OK
Content-Length: 2080
Content-Type: application/vnd.docker.distribution.manifest.list.v2+json
Docker-Content-Digest: sha256:d366a4665ab44f0648d7a00ae3fae139d55e32f9712c67accd604bb55df9d05a
Docker-Distribution-Api-Version: registry/2.0
Etag: "sha256:d366a4665ab44f0648d7a00ae3fae139d55e32f9712c67accd604bb55df9d05a"
Date: Sun, 11 Oct 2020 21:04:59 GMT
Strict-Transport-Security: max-age=31536000

您可以将该ETag或Docker Content Digest标头与之前提取的图像上的注册表引用进行比较:

$ docker image inspect busybox:latest --format '{{json .RepoDigests}}' | jq .
[
  "busybox@sha256:d366a4665ab44f0648d7a00ae3fae139d55e32f9712c67accd604bb55df9d05a"
]

$ docker image pull busybox:latest
latest: Pulling from library/busybox
Digest: sha256:d366a4665ab44f0648d7a00ae3fae139d55e32f9712c67accd604bb55df9d05a
Status: Image is up to date for busybox:latest
docker.io/library/busybox:latest

我还研究了一些Go API和CLI,以与更多的注册中心合作,在这些注册中心中,您可能需要传递不同类型的授权。该项目位于regclient/regclient,包括一个regctl命令。

$ regctl image digest --list busybox:latest
sha256:d366a4665ab44f0648d7a00ae3fae139d55e32f9712c67accd604bb55df9d05a
 类似资料:
  • 问题内容: 我想找出本地是否存在带有特定标签的Docker映像。如果Docker客户端无法本地执行此操作,我可以使用bash脚本。 仅为了提供一些可能的bash脚本提示,运行命令的结果将返回以下内容: 问题答案: 我通常会测试的结果(如以下脚本所示): 但 由于 仅将其 作为参数,因此您需要对tag进行grep,而不使用 。 立即获取标签(docker 1.8+) 下面提到的另一种方法是使用doc

  • 我想删除一个本地图像标记(“存储库”/“标记”组合)。有可能吗? 我如何才能在仅与一个图像ID相关联的多个标记中删除任何一个标记而不删除其他标记?在我的情况下,我只想排除hiworld存储库。我可以删除图像,因此也可以删除与之相关联的所有标签,但这不是我想要做的。下面是输入命令docker images时显示的内容。 提前道谢。

  • 我这里有一个起始docker脚本: 事实是这个脚本的结果不正确。每次运行脚本时,它都会删除旧容器。 “启动新容器”部分将拉取最新的映像。下面是 docker pull 的示例输出(如果本地映像是最新的): 状态: 映像是最新的 我的示例注册表:5050/Web 客户端:最新 有没有什么方法可以通过添加条件来改进我的脚本: 在做任何事情之前,请检查通过 docker 拉取本地映像是否是注册表上可用的

  • 2.我尝试创建一个注册表,然后将图像放入其中,但这也不起作用。我可能做错了,但我找不到正确的指令来完成这项任务。 请提供在本地kubernetes实例中使用本地docker映像的说明。 OS:ubuntu 16.04 Docker:Docker版本1.13.1,版本092CBA3 Kubernetes: 如果有人能帮我找到一个使用docker-compose的解决方案,那就太棒了。

  • 我正在开发天气应用程序,当应用程序第一次推出时,我想检测用户当前位置,但我尝试使用谷歌地图,但他们要求信用卡,以获得谷歌地图的api密钥,不幸的是,我没有信用卡。你有其他的解决方案或替代方案吗。

  • 例如,我在本地有此图像https://github.com/topflight-technology/docker-images/tree/master/go-testing.然后系统丢失了所有关于它的信息。那么我们如何重新创建图像docker文件呢?或者在列表中获取安装了哪些工具的列表。 所以我需要调查docker集装箱或strait forward图像?