使用 http://github.com/fsouza/go-dockerclient通过ManifestV2 API获取对应的IMAGE ID
// 列出指定镜像的ID
func GetImageId(imageName string) string{
url := "http://" + registryHost
username := "" // anonymous
password := "" // anonymous
hub, err := registry.New(url, username, password)
var digest string
if nil != err {
return digest
}
split := strings.Split(imageName, ":")
if 2 != len(split) {
return digest
}
manifest, err := hub.ManifestV2(split[0], split[1])
data, _ := json.Marshal(&(manifest))
fmt.Printf("manifest :%s\n", string(data))
splitDigest := strings.Split(string(manifest.Config.Digest), ":")
if 2 != len(splitDigest){
return digest
}
return splitDigest[1]
}
打印结果如下(格式化过):
manifest :{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 1461,
"digest": "sha256:ff0fea8310f3957d9b1e6ba494f3e4b63cb348c76160c6c15578e65995ffaa87"
},
"layers": [{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 28565909,
"digest": "sha256:4d32b49e2995210e8937f0898327f196d3fcc52486f0be920e8b2d65f150a7ab"
}]
}
完整示例:
package main
import (
"encoding/json"
"fmt"
"strings"
docker "github.com/fsouza/go-dockerclient"
"github.com/heroku/docker-registry-client/registry"
)
const (
mediaType = "application/vnd.docker.distribution.manifest.v2+json"
)
// 列出指定镜像的ID
func GetImageId(imageName string) string{
url := "http://" + "192.168.0.106:5000"
username := "" // anonymous
password := "" // anonymous
hub, err := registry.New(url, username, password)
var digest string
if nil != err {
return digest
}
split := strings.Split(imageName, ":")
if 2 != len(split) {
return digest
}
manifest, err := hub.ManifestV2(split[0], split[1])
data, _ := json.Marshal(&(manifest.Config))
fmt.Printf("manifest.Digest :%s\n", string(data))
data, _ = json.Marshal(&(manifest))
fmt.Printf("manifest :%s\n", string(data))
splitDigest := strings.Split(string(manifest.Config.Digest), ":")
if 2 != len(splitDigest){
return digest
}
return splitDigest[1]
}
func main() {
GetImageId("ubunut:v1")
}
输出结果:
2022/04/10 10:48:18 registry.ping url=http://192.168.0.106:5000/v2/
2022/04/10 10:48:18 registry.manifest.get url=http://192.168.0.106:5000/v2/ubunut/manifests/v1 repository=ubunut reference=v1
manifest.Digest :{"mediaType":"application/vnd.docker.container.image.v1+json","size":1461,"digest":"sha256:ff0fea8310f3957d9b1e6ba494f3e4b63cb348c76160c6c15578e65995ffaa87"}
manifest :{"schemaVersion":2,"mediaType":"application/vnd.docker.distribution.manifest.v2+json","config":{"mediaType":"application/vnd.docker.container.image.v1+json","size":1461,"digest":"sha256:ff0fea8310f3957d9b1e6ba494f3e4b63cb348c76160c6c15578e65995ffaa87"},"layers":[{"mediaType":"application/vnd.docker.image.rootfs.diff.tar.gzip","size":28565909,"digest":"sha256:4d32b49e2995210e8937f0898327f196d3fcc52486f0be920e8b2d65f150a7ab"}]}
Process finished with the exit code 0
格式化:
2022/04/10 10:48:18 registry.ping url=http://192.168.0.106:5000/v2/
2022/04/10 10:48:18 registry.manifest.get url=http://192.168.0.106:5000/v2/ubunut/manifests/v1 repository=ubunut reference=v1
manifest.Digest :{
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 1461,
"digest": "sha256:ff0fea8310f3957d9b1e6ba494f3e4b63cb348c76160c6c15578e65995ffaa87"
}
manifest :{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 1461,
"digest": "sha256:ff0fea8310f3957d9b1e6ba494f3e4b63cb348c76160c6c15578e65995ffaa87"
},
"layers": [{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 28565909,
"digest": "sha256:4d32b49e2995210e8937f0898327f196d3fcc52486f0be920e8b2d65f150a7ab"
}]
}
如果想获取本地的镜像id等信息,可通过如下代码获取:
package main
import (
"fmt"
docker "github.com/fsouza/go-dockerclient"
)
func main() {
test()
}
func test() {
client, err := docker.NewClientFromEnv()
if err != nil {
panic(err)
}
imgs, err := client.ListImages(docker.ListImagesOptions{All: false})
if err != nil {
panic(err)
}
for _, img := range imgs {
fmt.Println("ID: ", img.ID)
fmt.Println("RepoTags: ", img.RepoTags)
fmt.Println("Created: ", img.Created)
fmt.Println("Size: ", img.Size)
fmt.Println("VirtualSize: ", img.VirtualSize)
fmt.Println("ParentId: ", img.ParentID)
}
}