如何解决Docker映像的操作系统平台?

时间:2019-04-17 12:36:51

标签: docker

有没有一种方法可以以编程方式确定docker映像的操作系统版本,而无需提取映像或检查docker文件?

当我在Docker集线器上查看流行图像时(例如openjdk),似乎惯例是将操作系统编码为标记名(例如windowsservercore-1803)。这种方法的问题在于,并非所有图像都可能遵循此约定。

似乎docker实际上知道该平台,因为当我在Windows上拉一个nginx映像时,它抱怨该映像不支持该平台。

docker是否提供API驱动的机制来为给定的映像名称和标签解析操作系统平台?

我找到了How to filter Docker images by platform?,但这要求图像已经被拉出。我正在寻找一种解决方案,该解决方案使我可以使用image:tag查询注册表并检索os/arch而无需提取图像。

我还发现了https://docs.docker.com/engine/reference/commandline/manifest/,但这仍处于试验阶段,看起来还需要清单文件存在于本地计算机上。

1 个答案:

答案 0 :(得分:2)

方法1-Docker引擎API

您可以使用docker engin API: Get image information from the registry

获取图像信息

例如,您需要获取带有标签openjdk的映像10.0.1-jdk-windowsservercore-1709的平台信息,您可以按如下所示调用docker引擎API:

curl --unix-socket /var/run/docker.sock  "http://v1.39/distribution/openjdk:10.0.1-jdk-windowsservercore-1709/json"

PS:v1.39是我的Docker版本,您应该根据自己的Docker环境进行替换。

响应:

{
    "Descriptor":{
        "mediaType":"application/vnd.docker.distribution.manifest.list.v2+json",
        "digest":"sha256:8394bc010c538ffc5f56386466a728d205edd70317bd320aa44e50c8533a229a",
        "size":480
    },
    "Platforms":[
        {
            "architecture":"amd64",
            "os":"windows",
            "os.version":"10.0.16299.547"
        }
    ]
}

Platforms字段应该是您所需要的:

  

包含图像支持的所有平台的数组

有一个doc描述了如何调用docker引擎API。

方法2-Docker Registry API

要调用docker Registry API,您只需要一个http客户端,例如。 curl,不需要Docker客户端。

1。获取授权令牌。

请参阅Token Authentication Specification以获得更多详细信息。

例如,您需要查询图像library/openjdk

curl --url "https://auth.docker.io/token?service=registry.docker.io&scope=repository:library/openjdk:pull"

scope 字段表示您需要在子序列API调用中查询哪个image

响应:

{"token": "eyJhb......"}

从上面的响应中保存token

2。获取图片清单

参考:

2.1。 Docker Registry HTTP API V2#manifest
2.2。 Image mainfest

例如,您需要获取带有标签openjdk的图像10.0.1-jdk-windowsservercore-1709的清单,然后可以发出如下请求:

curl -H "Accept: application/vnd.docker.distribution.manifest.list.v2+json" -H "Authorization: Bearer eyJh..." --url "https://registry.hub.docker.com/v2/library/openjdk/manifests/10.0.1-jdk-windowsservercore-1709"

注意:将Authorization标头字段替换为从步骤1获得的令牌。请确保在带有Bearer

的令牌之前插入前缀

响应:

{
  "schemaVersion": 2,
  "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
  "manifests": [
    {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "size": 2825,
      "digest": "sha256:c8a1d8756ae34cdf361da263ed3f7ef98b7dc3718d5e445e8e6bd277989a4bde",
      "platform": {
        "architecture": "amd64",
        "os": "windows",
        "os.version": "10.0.16299.547"
      }
    }
  ]
}

manifests[i].platform.os字段应该是您所需要的。