我如何检查我的本地 Docker 形象是否过时,而不从其他地方推?

myzjeezk  于 2023-01-25  发布在  Docker
关注(0)|答案(5)|浏览(124)

我在Coreos服务器上的一个Docker容器中运行一个react应用程序,假设它是从https://hub.docker.com/r/myimages/myapp的dockerhub中提取出来的。
现在我想定期检查应用程序容器的dockerhub映像是否已经更新,看看我在本地运行的映像是否落后。
检查本地docker镜像是否比远程镜像过时的最有效方法是什么?到目前为止,我找到的所有解决方案都是bash脚本或外部服务,它们会推送更新。我希望找到一个尽可能适合docker的解决方案,并且希望避免从其他地方推送通知(提醒服务器有更新的镜像)。

5sxhfpxr

5sxhfpxr1#

您可以查询注册表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,以便与更多的注册中心一起工作,在这些注册中心中,你可能需要传递不同类型的授权。

$ regctl image digest --list busybox:latest
sha256:d366a4665ab44f0648d7a00ae3fae139d55e32f9712c67accd604bb55df9d05a
ne5o7dgx

ne5o7dgx2#

如果您正在使用Docker Hub,则可以使用Webhook通知Docker主机有关更新的信息,并对此采取操作。
使用webhook将是“简单”的方法(我认为),否则您将不得不在docker拉中进行某种爬行,或者如@alebianco所解释的那样,比较一些散列或构建/创建日期。
下面是关于它的文档:https://docs.docker.com/docker-hub/webhooks/

sqyvllje

sqyvllje3#

有一个用于Docker Hub的API available
您应该能够获得标记列表,并从那里获得清单详细信息

    • 编辑**

我做了一些调查,看起来他们没有暴露任何类型的图像校验和,它的清单或组成它的层。
我找到的最接近的东西是创建日期...如果你想做一些远程安全的东西,我不建议你使用它。
不管怎样,你得先拿到通行令牌

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的history对象,你会发现一个 * created * 属性。
然后,您可以使用获取本地映像的创建日期

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

把两者比较一下然后畏缩...

uubf1zoe

uubf1zoe4#

Issue 30906(检查本地容器映像是否过期的Docker命令?)刚刚提到(2023年1月):
您可以尝试使用**Diun**执行此任务。
它检查更新,然后可以通过许多提供程序通知您。

DockerI Mage UpdateNotifier是一个用Go语言编写的CLI应用程序,作为单个可执行文件(和Docker映像)交付,用于在Docker注册表中更新Docker映像时接收通知。

在Go语言中,这可以通过Go语言支持的所有平台和架构上的独立二进制分布来实现。
请参阅Marco d'Aleo博客文章“DIUN: Docker Image Update Notifier
Diun支持很多服务,但对于这类项目我通常选择Telegram。

gab6jxml

gab6jxml5#

我用一个直接检查Dockerfile或from字符串的爬虫解决了这个问题。
我把所有东西都备份到一个可以在docker hub中找到的Docker映像中。
我只是在我的gitlabci管道中运行图像,如果基本图像过时,is会打印所有较新的版本,这样你就可以很容易地选择标签。
链接:https://hub.docker.com/r/olafnorge/docker-image-crawler/

相关问题