如何解析docker映像的操作系统平台?
是否有一种方法可以通过编程方式确定docker映像的操作系统版本,而无需拉动映像或检查docker文件 当我看到docker hub上流行的图像(例如如何解析docker映像的操作系统平台?,docker,Docker,是否有一种方法可以通过编程方式确定docker映像的操作系统版本,而无需拉动映像或检查docker文件 当我看到docker hub上流行的图像(例如openjdk)时,似乎惯例是将操作系统编码到标记名中(例如windowsservercore-1803)。这种方法的问题是,并非所有图像都遵循此约定 docker似乎确实了解这个平台,因为当我在Windows上拉一个nginx映像时,它会抱怨映像不支持这个平台 docker是否提供API驱动的机制来解析操作系统平台上给定的映像名和标记 我发现,但
openjdk
)时,似乎惯例是将操作系统编码到标记名中(例如windowsservercore-1803
)。这种方法的问题是,并非所有图像都遵循此约定
docker似乎确实了解这个平台,因为当我在Windows上拉一个nginx
映像时,它会抱怨映像不支持这个平台
docker是否提供API驱动的机制来解析操作系统平台上给定的映像名和标记
我发现,但这需要图像已经被提取。我正在寻找一种解决方案,允许我使用image:tag
查询注册表,并在不拉取图像的情况下检索os/arch
我还发现,但这仍然是实验性的,而且看起来它还需要在本地计算机上显示清单文件。Approach 1-Docker engine API
您可以使用
例如,您需要使用标签10.0.1-jdk-windowsservercore-1709
获取imageopenjdk
的平台信息,您可以如下调用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.获取授权令牌。
请参考更多细节
例如,您需要查询imagelibrary/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.12.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上的公共映像时,我会返回正确的清单信息,但当我在私有注册表上查询我自己上传的映像时,我会得到未知清单错误。