检查 Docker 图像,无需拉动它们
检查 Docker 图像,无需拉动它们
原文:https://medium.com/hackernoon/inspecting-docker-images-without-pulling-them-4de53d34a604

嘿,
根据你要构建的内容,可能会发生这样的情况,其中一部分涉及到从注册表中检查 Docker 映像,但是你负担不起。
原来有一个 API 可以让你做到这一点——无论是 DockerHub 还是私有注册表。
Docker Registry HTTP API 是一种便于向 Docker 引擎分发图像的协议。它与 docker registry 的实例进行交互,docker registry 是一种管理 docker 图像信息并支持其分发的服务。
在本地测试
本地测试的第一步是从库/注册表映像中创建一个注册表。
检查它是否确实在工作:
让本地注册中心工作起来,我们可以直接从注册中心元数据转移到检查图像的脚本。下面的脚本包含了检索它所需要的全部内容,并且只依赖于两个依赖项:bash和 jq 。
ps。:需要注意的是,API 调用需要指定它接受的内容类型( *application/vnd.docker.distribution.manifest.v2+json* )。
现在让我们来看看它是否真的有效:
酷,它确实有效!
虽然这对于不需要认证的注册中心来说是可行的,但它并不适合 DockerHub。在那里检查公共图像时,我们需要在获取图像摘要之前执行一个额外的步骤——检索一个令牌。有了这样的令牌,我们就可以检查公共或私有图像。
回到脚本,让我们创建一个不同的脚本来处理这种情况—称之为get-public-image-config.sh(这是为了简洁起见,使用一些其他编程语言,您可以放置一些条件并检测每种情况)。
额外的代码可以放在一个名为get_token的方法中,该方法只将image作为一个参数:
有了令牌,就只需要在其他呼叫中使用它了。
如果我们的目标是私有图像,我们需要稍微修改一下get_token:在从auth.docker.io获取令牌的调用中,我们需要使用 DockerHub 用户名和密码对(没有身份验证,我们只能访问公共图像)。为此,在调用中指定一个授权头(curl中的--user标志):
现在,有了这个新的令牌,我们可以检索给定图像和标签的摘要(注意我们添加的额外的Authorization: Bearer $token头):
这样我们就可以有一个完整的脚本来从 DockerHub 中检索公共图像(看看在main中我们如何首先检索一个令牌,然后我们将这个令牌传递给下面的方法):
注意。:同样,必须添加图片的全名(官方图片使用的是 *library* 资源库所以 *nginx* 应该简称为 *library/nginx* )。
为了确保它能正常工作,对类似于 nginx 的图像运行它:
如果你试图检索一个不是很新的图像(比如说,有两年了),你会注意到我上面发布的脚本可能不起作用。
原因是很久以前就被推送到 docker 注册表的图像不会使用第二版的 V2 清单。但是,即使在常规字符串中,它们仍然显示图像配置。
贝娄是一个处理这种情况的脚本:
如果你在寻找差异,看看main。本质上,我们放弃了检索一个digest的想法,简单地选择“旧配置”。在旧的配置中,我们看到了列表中的第一个 blob,它代表了最上层——包含所有信息的层。在那里,我们解析纯文本 JSON,然后获取配置。
结束语
与 DockerHub 或私有注册表交互并不困难,只是没有很好的文档记录。有了这些脚本,让它在您想要的任何语言上工作变得非常容易——只需添加一些检查,解析图像名称,您就可以开始工作了。
下面是文章中提到的资源:
在我第一次在 ops.tips 上发表这篇文章后,我不能不提到人们建议的一些替代方案来结束这篇文章:
- https://github.com/GoogleCloudPlatform/container-diff—“区分您的码头工人集装箱”——这看起来很有趣,但是即使您可以在分析图像时为其指定
remote://,它看起来总是会拖动整个图像。也许我做错了什么? - https://github.com/projectatomic/skopeo—“与远程图像注册中心合作——检索信息、图像、签署内容” —嗯,言出必行!我完全推荐的目的是检查图像或存储库,而不拉他们👍
顺便说一下,如果你不想尝试 Skopeo,在 MacOS 上从源代码构建它非常容易:
现在,从 Dockerhub 检查图像或存储库只需要一个命令:
请注意,这里我为命令指定了--override-os标志。原因是,否则它将尝试通过标记有OS=darwin的摘要来检查图像或存储库过滤。如果您使用的是 Linux,就不需要使用该标志。
如果你不愿意用你最喜欢的语言来实现,而只想收集图像的配置,那么一定要检查 Skopeo。
如果我有错,或者有更简单的方法,请告诉我。
祝你玩得开心!
精加工
原为发表于ops . tips《T21》2017 年 11 月 26 日。