有没有一种方法可以以编程方式确定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/,但这仍处于试验阶段,看起来还需要清单文件存在于本地计算机上。
答案 0 :(得分:2)
您可以使用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。
要调用docker Registry API,您只需要一个http客户端,例如。 curl
,不需要Docker客户端。
请参阅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.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
字段应该是您所需要的。