我正在使用 Docker Registry API , 首先使用 List repositories 列出注册表中的所有图像方法,然后在图像中循环以创建一个 map[string] []string :image []tags 使用 Listing image tags方法。
我试过了
func GetImages(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
res, err := http.Get(fmt.Sprintf("%s/%s", sconf.RegistryConf.url, sconf.RegistryConf.listrepo))
if err != nil {
w.WriteHeader(500)
log.Errorf("Could not get repositories: %s", err)
return
}
log.Info("Registry accessed")
js, err := ioutil.ReadAll(res.Body)
if err != nil {
w.WriteHeader(500)
log.Errorf("Could not read response: %s", err)
return
}
log.Infof("response read successfully")
var Repositories map[string][]string
err = json.Unmarshal(js, &Repositories)
if err != nil {
w.WriteHeader(500)
log.Errorf("Could not transform json to map: %s", err)
return
}
res.Body.Close()
if err != nil {
log.Warnf("Could not close body")
}
var Images []string
Images = Repositories["repositories"]
//map_image_tags := make(map[string][]string)
var map_image_tags map[string]interface{}
map_images_tags := make(map[string][]string)
log.Debugf("OK")
for i := 0; i < len(Images); i++ {
log.Debugf("OK")
res2, err := http.Get(fmt.Sprintf("%s/v2/%s/tags/lists", sconf.RegistryConf.url, Images[i]))
if err != nil {
w.WriteHeader(500)
log.Errorf("could not get tags: %s", err)
return
}
log.Debugf("OK")
js2, err := ioutil.ReadAll(res2.Body)
if err != nil {
w.WriteHeader(500)
log.Errorf("could not read body: %s", err)
return
}
log.Debugf("OK")
log.Debugf("%v", []byte(js2))
err = json.Unmarshal(js2, &map_image_tags)
log.Debugf("map:", map_image_tags)
log.Debugf("OK")
if err != nil {
w.WriteHeader(500)
log.Errorf("could not unmarshal json: %s", err)
return
}
log.Debugf("OK")
//map_images_tags[map_image_tags["name"]] = map_image_tags["tags"]
}
response, err := json.MarshalIndent(map_images_tags, "", " ")
if err != nil {
w.WriteHeader(500)
log.Errorf("Could not transform map to json: %s", err)
return
}
log.Infof("Get Registry Images: success")
fmt.Fprintf(w, string(response))
}
但它不起作用,任何人都可以告诉我我的错误或告诉我如何从头开始做这个吗?
最佳答案
据我所知,您无法将数组解码为 map[string][]string 类型的 Go 值。作为JimB说你应该创建接口(interface)然后解码。
这是您对图像 API 的 Docker 响应(来自:Docker api):
j := []byte(`[
{
"RepoTags": [
"ubuntu:12.04",
"ubuntu:precise",
"ubuntu:latest"
],
"Id": "8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c",
"Created": 1365714795,
"Size": 131506275,
"VirtualSize": 131506275,
"Labels": {}
},
{
"RepoTags": [
"ubuntu:12.10",
"ubuntu:quantal"
],
"ParentId": "27cf784147099545",
"Id": "b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc",
"Created": 1364102658,
"Size": 24653,
"VirtualSize": 180116135,
"Labels": {
"com.example.version": "v1"
}
}
]`)
很明显你不能解压到 map[string][]string ( Go playground here )
如果你想为此使用你的东西,那么请制作界面并解压到该界面。也将其用于 JSON https://github.com/antonholmquist/jason .比原来的encoding/json简单多了
关于go - 如何在 docker registry api 中为带有标签的图像名称创建 map[string][]string?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38507939/