【问题标题】:How can I create a map[string][]string in docker registry api for image name with its tags?如何在 docker registry api 中为带有标签的图像名称创建一个 map[string][]string?
【发布时间】:2016-07-21 15:09:45
【问题描述】:

我正在使用Docker Registry API,首先使用List repositories 方法列出注册表中的所有图像,然后使用Listing image tags 方法在图像中循环创建一个map[string] []string :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))

}

但它不起作用,谁能告诉我我的错误或告诉我如何从头开始?

【问题讨论】:

  • 您能否详细说明“它不工作”?
  • 如果您声明一些正确的类型,而不是依赖interface{},这可能会更容易。你没有尝试过有什么原因吗?
  • @JimB 谢谢它现在工作了
  • @JHarris 我收到响应不是对象的错误

标签: go docker docker-compose dockerfile docker-registry


【解决方案1】:

据我所知,您无法将数组解组为 map[string][]string 类型的 Go 值。正如JimB 所说,您应该创建接口,然后对其进行解组。

这是您对图像 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-dockerclient 用于 docker api,但现在我需要从 docker 注册表中获取图像,该注册表也有一个 api,但没有好的客户端
  • 感谢 jason 库我支持你的答案,你可以编辑你的答案并删除 go-docker cient 的东西(超出主题)以便我接受它
  • @SaidSaifi 我已经删除了 go docker 客户端的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 2015-11-17
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 2020-03-10
相关资源
最近更新 更多