golang 获取registry镜像id

使用 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)
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值