2016-07-21 18 views
-1

Ich verwende Docker Registry API, um zuerst alle Bilder in der Registrierung mit List repositories Methode aufzulisten und dann in die Bilder zu loopen, um eine map [string] [] string: image [] Tags mit Listing image tags Methode zu erstellen.Wie kann ich eine map [string] [] Zeichenfolge in Docker Registry API für Bildname mit seinen Tags erstellen?

ich versucht, dieses

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)) 

} 

Aber seine nicht funktioniert, kann meine Fehler jemand zeigen Sie mir oder mir zeigen, wie ich dies von Grund auf neu machen kann?

+1

Können Sie bitte auf "es funktioniert nicht" bitte? – johnharris85

+2

Es wäre wahrscheinlich einfacher, wenn Sie einige geeignete Typen deklarierten, anstatt sich auf 'interface {}' zu verlassen. Gibt es einen Grund, warum du das nicht versucht hast? – JimB

+0

@JimB Vielen Dank, es hat jetzt funktioniert –

Antwort

1

Soweit ich sehen kann Sie Array in Go-Wert des Typs map [string] [] string nicht entpacken. Wie JimB sagt, sollten Sie Schnittstelle und dann unmarshal dazu machen.

Das ist Ihre Docker Antwort von API für Bilder (aus: 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" 
    } 
    } 
]`) 

Es ist offensichtlich, Sie nicht in der Karte entpacken [string] [] string (Go playground here)

Wenn Sie Ich möchte dein Ding dafür benutzen, dann mache ich die Schnittstelle und entpacke diese Schnittstelle. Verwenden Sie dieses auch für JSON https://github.com/antonholmquist/jason. Es ist viel einfacher, dass Original-Codierung/JSON

+0

willst du kommentieren? – pregmatch

+0

Entschuldigung jetzt kehrte ich zu meinem Laptop zurück Ill chek Ihre Antwort danke –

+0

Ich benutzte go-dockerclient für docker api, aber jetzt was ich brauche, ist Bilder von docker Registrierung, die auch eine API haben und es gibt keine netten Kunden dafür –