如何在不从其他地方推送的情况下检查我的本地泊坞窗图像是否过时?

时间:2017-02-09 13:03:38

标签: bash docker systemd coreos

我在Coreos服务器上的docker容器中运行react应用程序。让我们说它是从https://hub.docker.com/r/myimages/myapp的dockerhub中提取的。

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

与远程图像相比,检查本地泊坞窗图像是否过时的最有效方法是什么?到目前为止,我发现的所有解决方案都是bash脚本或推动更新的外部服务。我想找到一个尽可能与docker本机相同的解决方案,并且希望不要从其他地方推送通知(以警告服务器更新图像)。

4 个答案:

答案 0 :(得分:5)

如果您使用的是Docker Hub,则可以使用Webhook通知docker主机有关更新的信息,并对其采取措施。

使用webhook将是"简单"这样做的方式(我认为)否则你将不得不在docker pull中进行某种爬行或者@alebianco比较一些散列或构建/创建日期。

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

答案 1 :(得分:3)

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的历史对象,您将找到创建的属性。

然后,您可以使用

获取本地图像创建日期
docker inspect --format "{{json .Created}}" ubuntu:latest

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

答案 2 :(得分:1)

我通过直接检查Dockerfile或from字符串的搜寻器解决了这个问题。

我将所有内容都备份到了一个可以在docker hub中找到的泊坞窗图片。

我只是在gitlab ci管道中运行图像。如果基本图像已过时,则会打印所有较新版本,以便您可以轻松选择标记。

链接:https://hub.docker.com/r/olafnorge/docker-image-crawler/

答案 3 :(得分:0)

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

'first_name': info.xpath('.//td/a/text()').get() # Notice the .

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

void display() {
    for (int i = 0; i < content.size(); i++) {
        for (int j = 0; j < content[i].size(); j++)
            cout << content[i][j] << " ";
        cout << endl;
    }
};

我还一直在研究一些Go API和CLI,以与更多可能需要传递不同类型授权的注册表进行合作。该项目位于regclient/regclient,包括一个$ 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 命令。

$ 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