Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解析docker映像的操作系统平台?_Docker - Fatal编程技术网

如何解析docker映像的操作系统平台?

如何解析docker映像的操作系统平台?,docker,Docker,是否有一种方法可以通过编程方式确定docker映像的操作系统版本,而无需拉动映像或检查docker文件 当我看到docker hub上流行的图像(例如openjdk)时,似乎惯例是将操作系统编码到标记名中(例如windowsservercore-1803)。这种方法的问题是,并非所有图像都遵循此约定 docker似乎确实了解这个平台,因为当我在Windows上拉一个nginx映像时,它会抱怨映像不支持这个平台 docker是否提供API驱动的机制来解析操作系统平台上给定的映像名和标记 我发现,但

是否有一种方法可以通过编程方式确定docker映像的操作系统版本,而无需拉动映像或检查docker文件

当我看到docker hub上流行的图像(例如
openjdk
)时,似乎惯例是将操作系统编码到标记名中(例如
windowsservercore-1803
)。这种方法的问题是,并非所有图像都遵循此约定

docker似乎确实了解这个平台,因为当我在Windows上拉一个
nginx
映像时,它会抱怨映像不支持这个平台

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

我发现,但这需要图像已经被提取。我正在寻找一种解决方案,允许我使用
image:tag
查询注册表,并在不拉取图像的情况下检索
os/arch

我还发现,但这仍然是实验性的,而且看起来它还需要在本地计算机上显示清单文件。

Approach 1-Docker engine API 您可以使用

例如,您需要使用标签
10.0.1-jdk-windowsservercore-1709
获取image
openjdk
的平台信息,您可以如下调用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"
        }
    ]
}
{"token": "eyJhb......"}
{
  "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"
      }
    }
  ]
}
Platforms
字段应该是您需要的:

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

下面是一个描述如何调用docker引擎API的示例

方法2-Docker注册表API 要调用docker registry API,您只需要一个http客户端,例如,
curl
,不需要docker客户端

1.获取授权令牌。 请参考更多细节

例如,您需要查询image
library/openjdk

curl --url "https://auth.docker.io/token?service=registry.docker.io&scope=repository:library/openjdk:pull"
范围
字段指示在子序列API调用中需要查询的图像

答复:

{
    "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"
        }
    ]
}
{"token": "eyJhb......"}
{
  "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"
      }
    }
  ]
}
保存上述响应中的
标记

2.获取图像清单 参考:

2.1
2.2.

例如,您需要获取image
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"
注意:将
授权
标题字段替换为从步骤1获得的令牌。确保在带有
承载的令牌之前插入前缀

答复:

{
    "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"
        }
    ]
}
{"token": "eyJhb......"}
{
  "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"
      }
    }
  ]
}

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

这似乎只在我查询本地docker引擎时起作用。当我直接对Docker hub或Artifactory进行查询时,有什么方法可以实现这一点吗?我已经用另一种方法使用纯http API更新了答案,希望它能有所帮助……还有一件事,这对openjdk这样的公共映像很有效,但是当我在Artifactory上用自己的映像进行尝试时,我得到了
MANIFEST\u UNKNOWN
,我需要为我的图像显式添加清单吗?你是说
JFrog人工制品
?是的。我们已经建立了一个虚拟存储库,它将私有开发存储库与公共docker hub链接起来。当我查询docker hub上的公共映像时,我会返回正确的清单信息,但当我在私有注册表上查询我自己上传的映像时,我会得到未知清单错误。