14

我知道我可以使用这个命令$ 码头工人图像--树 docker history查看 Docker 映像的图层,但是如何在不拉取 Docker Hub 上的映像的情况下执行此操作?这是为了让我在下载之前知道图像上的内容。

例如,对于 Tomcat 存储库https://registry.hub.docker.com/_/tomcat/,网页似乎没有显示图像上的内容。我必须查看 Github 上的 Dockerfile 才能找到答案。

更新我看到这个 repo https://registry.hub.docker.com/u/tutum/tomcat/有更多标签。“Dockerfile”选项卡显示它是如何创建的,但似乎只显示最新版本。是否没有选择查看其他标签的文件?

4

4 回答 4

15

Docker Hub 目前非常有限,不提供您要求的功能。

当一个镜像被配置为从 Docker Hub 的源代码构建(一个自动构建)时,您可以看到其中的内容,但是当它被预先构建上传时,您没有任何信息。

于 2014-11-30T08:29:02.723 回答
4

使用microbadger,它也带有一些徽章,例如:

所以你在https://microbadger.com/images/tomcat上的 tomcat 图像看起来像:

MicroBadger 上的 Tomcat 图像

于 2018-10-27T10:27:22.470 回答
4

现在可以通过单击Docker Hub上的图像标签来实现。

在此处输入图像描述

于 2020-02-20T12:38:08.190 回答
2

您可以使用注册表 API 为任何注册表获取此信息。镜像清单中有一个指向镜像配置的指针,该配置是一个包含历史步骤的 json blob。请注意,此历史记录不具有权威性,并且取决于构建工具,可能会报告与实际用于构建映像层的命令不同的命令。

使用 Docker Hub 的身份验证的 shell 脚本版本如下所示:

#!/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 .history

在幕后,注册表首先将任何清单列表解析为默认架构的单个清单,但您可以手动拉取任何架构:

$ regctl image manifest --list localhost:5000/library/alpine:latest --format '{{jsonPretty .}}'
{
  "manifests": [
    {
      "digest": "sha256:69704ef328d05a9f806b6b8502915e6a0a4faa4d72018dc42343f511490daf8a",
      "mediaType": "application\/vnd.docker.distribution.manifest.v2+json",
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      },
      "size": 528
    },
    {
      "digest": "sha256:18c29393a090ba5cde8a5f00926e9e419f47cfcfd206cc3f7f590e91b19adfe9",
      "mediaType": "application\/vnd.docker.distribution.manifest.v2+json",
      "platform": {
        "architecture": "arm",
        "os": "linux",
        "variant": "v6"
      },
      "size": 528
    },
...

然后该平台特定清单包括配置和层:

$ regctl image manifest localhost:5000/library/alpine@sha256:69704ef328d05a9f806b6b8502915e6a0a4faa4d72018dc42343f511490daf8a --format '{{jsonPretty .}}'
{
  "schemaVersion": 2,
  "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
  "config": {
    "mediaType": "application/vnd.docker.container.image.v1+json",
    "size": 1471,
    "digest": "sha256:14119a10abf4669e8cdbdff324a9f9605d99697215a0d21c360fe8dfa8471bab"
  },
  "layers": [
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 2814446,
      "digest": "sha256:a0d0a0d46f8b52473982a3c466318f479767577551a53ffc9074c9fa7035982e"
    }
  ]
}

拉动配置 blob 会显示您可能从历史记录和检查命令中识别的所有内容:

$ regctl blob get localhost:5000/library/alpine sha256:14119a10abf4669e8cdbdff324a9f9605d99697215a0d21c360fe8dfa8471bab | jq .
{
  "architecture": "amd64",
  "config": {
    "Hostname": "",
    "Domainname": "",
    "User": "",
    "AttachStdin": false,
    "AttachStdout": false,
    "AttachStderr": false,
    "Tty": false,
    "OpenStdin": false,
    "StdinOnce": false,
    "Env": [
      "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    ],
    "Cmd": [
      "/bin/sh"
    ],
    "Image": "sha256:d3e0b6258ec2f725c19668f11ae5323c3b0245e197ec478424ec6a87935690eb",
    "Volumes": null,
    "WorkingDir": "",
    "Entrypoint": null,
    "OnBuild": null,
    "Labels": null
  },
  "container": "330289c649db86f5fb1ae5bfef18501012b550adb0638b9193d4a3a4b65a2f9b",
  "container_config": {
    "Hostname": "330289c649db",
    "Domainname": "",
    "User": "",
    "AttachStdin": false,
    "AttachStdout": false,
    "AttachStderr": false,
    "Tty": false,
    "OpenStdin": false,
    "StdinOnce": false,
    "Env": [
      "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    ],
    "Cmd": [
      "/bin/sh",
      "-c",
      "#(nop) ",
      "CMD [\"/bin/sh\"]"
    ],
    "Image": "sha256:d3e0b6258ec2f725c19668f11ae5323c3b0245e197ec478424ec6a87935690eb",
    "Volumes": null,
    "WorkingDir": "",
    "Entrypoint": null,
    "OnBuild": null,
    "Labels": {}
  },
  "created": "2021-08-27T17:19:45.758611523Z",
  "docker_version": "20.10.7",
  "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
    }
  ],
  "os": "linux",
  "rootfs": {
    "type": "layers",
    "diff_ids": [
      "sha256:e2eb06d8af8218cfec8210147357a68b7e13f7c485b991c288c2d01dc228bb68"
    ]
  }
}

上面的 regctl 命令来自我的regclient项目,但我相信您可以使用 skopeo 和起重机执行类似的命令。这些工具相对于 curl 命令的优势在于处理不同注册表之间的身份验证(来自 Hub 的不记名令牌不适用于其他注册表)。

最后,使用 regctl 的单行答案是一个格式化的图像配置命令,它执行上述所有步骤而不需要 jq:

$ regctl image config localhost:5000/library/alpine:latest --format '{{jsonPretty .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
  }
]
于 2021-10-01T12:53:13.837 回答