如何在Docker Hub中检查Docker镜像?

7

有没有一种方法可以对存在于Docker hub上且尚未在本地拉取的镜像进行docker inspect

当涉及到Docker Hub时,Docker CLI的使用使我有些困惑。我可以进行docker login,但是此登录不能用于执行除了拉取或推送以外的任何远程操作。


不确定是否可以通过CLI实现,但是在Web UI上,您可以通过导航到标签(例如这里的nginx镜像)来实现。 - spygi
1
看起来现在你可以了。这个包似乎能够做到: https://github.com/containers/skopeo 它说它可以:
[检查] 远程的镜像,显示其属性(包括其层),而不需要将镜像拉到主机上。我在这篇博客文章中发现了它: https://ops.tips/blog/inspecting-docker-image-without-pull/ 它使用了“Docker Registry HTTP API V2”,这里有描述: https://docs.docker.com/registry/spec/api/ 按出现顺序存档的链接:
  • https://web.archive.org/web/20210907202916/https://github.com/containers/skopeo
  • https://web.archive.org/web/20210905214148/ht
- ADJenks
2个回答

7
根据Docker Hub文档 - Docker本身通过docker search、pull、login和push命令提供对Docker Hub服务的访问。看起来您不能在不拉取任何镜像的情况下执行docker inspect。

我猜它正在拉取,然后检查,然后...糟糕。 - Tal

2
有一个 API 可以做到这一点。Docker 提供了他们的 registry 2 API,最近还发布了 OCI distribution-spec。这涵盖了如何查询镜像仓库的清单和块。在镜像仓库中,你最有可能要找的是 config 块,它是 json 格式的,几乎包含了你在 docker inspect 中看到的所有字段。
较少涉及的是身份验证,这可能会因镜像仓库而异而变得有些复杂。Docker Hub 使用承载令牌,因此使用匿名承载令牌提取清单和配置的示例脚本如下:
#!/bin/sh

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

有多种工具可以为您执行所有这些API调用。我能想到的是:

  • RedHat的Skopeo
  • go-containerregistry的crane CLI
  • regclient的regctl CLI

作为regclient的作者,我有点偏见。结果命令看起来像:

$ regctl image inspect localhost:5000/library/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
    }
  ]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接