2017-03-15 11 views
2

Ich versuche, Docker Tutorial in eine docker run neu zu erstellen. Hier ist der folgende Code aus dem Online-Tutorial`docker run` mit Golong API (Docker docs)

package main 

import (
"io" 
"os" 

"github.com/docker/docker/client" 
"github.com/docker/docker/api/types" 
"github.com/docker/docker/api/types/container" 
"golang.org/x/net/context" 
) 

func main() { 
ctx := context.Background() 
cli, err := client.NewEnvClient() 
if err != nil { 
    panic(err) 
} 

_, err = cli.ImagePull(ctx, "alpine", types.ImagePullOptions{}) 
if err != nil { 
    panic(err) 
} 

resp, err := cli.ContainerCreate(ctx, &container.Config{ 
    Image: "alpine", 
    Cmd: []string{"echo", "hello world"}, 
}, nil, nil, "") 
if err != nil { 
    panic(err) 
} 

if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{});  err != nil { 
    panic(err) 
} 

if _, err = cli.ContainerWait(ctx, resp.ID); err != nil { 
    panic(err) 
} 

out, err := cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true}) 
if err != nil { 
    panic(err) 
} 

io.Copy(os.Stdout, out) 
} 

Das Problem, das ich mit diesem zu sehen ist, wenn ‚alpine‘ Docker, nicht verfügbar ist lokal, ist es nicht die neueste zu ziehen und landet einen Fehler werfen. zB XXXXX $ go_docker.go Panik laufen gehen: Fehler: Kein solches Bild: alpin

goroutine 1 [running]: 
     panic(0x27ffa0, 0xc4202afa50) 
    /usr/local/go/src/runtime/panic.go:500 +0x1a1 
    main.main() 
    /Users/rvenkatesh/go_coding/raghu_test_code/go_docker.go:30 +0x592 
    exit status 2 

Aber wenn ich die Kommandozeilen-Äquivalent laufen, ich sehe

XXXX$ docker run alpine echo hello world 
    Unable to find image 'alpine:latest' locally 
    latest: Pulling from library/alpine 
    627beaf3eaaf: Pull complete 

     Digest:sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4 
    Status: Downloaded newer image for alpine:latest 
    hello world 

Ich habe versucht der Suche durch Go-Client Muss ich irgendetwas mit der ImagePull-Funktion optimieren? Jede Hilfe hier wäre willkommen! Hier

ist der Link zu der Dokumentation https://docs.docker.com/engine/api/getting-started/

Update: Ich habe das gleiche Tutorial für Python-Version getestet, und es funktionierte gut. Ich frage mich, ob die Golang-Seite aktualisiert werden muss.

+0

Link zum Tutorial? – johnharris85

+0

Mein schlechtes! sollte das hinzugefügt haben! Meine Frage mit den Dokumenten aktualisiert! – tw1stud

Antwort

0

Der Docker-Client ist Open Source und in Go geschrieben, so dass Sie genau sehen können, wie sie ihre Version implementiert haben. Ich glaube, dass der relevante Code in der container/create.go pullImage Funktion ist.

+0

Kannst du darauf hinweisen, welche spezifischen Verbesserungen ich für die "create" -Funktion machen müsste? Ich habe versucht, "neueste" Zeichenfolge anzuhängen, aber es war keine Hilfe – tw1stud

+0

Das Problem ist, dass "Docker Run CLI Äquivalent in Golang funktioniert nicht (zumindest von dem, was Docker in seiner Website hat). Nicht ganz sicher, ob es wirklich der Go-Code oder etwas mit meinen nativen Docker-Konfigurationen ist. Wenn Sie oben sehen können, funktioniert der entsprechende docker run-Befehl einwandfrei – tw1stud

+0

Ich bin nicht sicher, wo Ihr Code Probleme hat und hatte keine Zeit, das Tutorial selbst zu versuchen. Das obige war mehr zu beantworten, was Docker in ihrem Code tut, um dies zu implementieren. – BMitch

1

Image.Pull gibt einen io.Reader zurück, den Sie lesen und schließen müssen; Wenn Sie nicht, wird die Verbindung geschlossen, bevor das Bild gezogen wird.

Sie können den Inhalt einfach verwerfen und schließen, dann funktioniert der Pull.

0

Hatte das gleiche Problem, die "Pull" schien nicht zu funktionieren. Eine Korrektur gefunden.

1) Ändern Sie bitte Ihre Zuglinie zu

pullstat, err = cli.ImagePull(ctx, "alpine", types.ImagePullOptions{}) 

und fügen

io.Copy(os.StdOut,pullstat) 

nach dem ImagePull

ich nicht versucht haben, einen

io.Copy(nil,pullstat) 

zu tun, aber das ist auf meiner Liste von t Versuche, als nächstes zu versuchen.

+0

Nur fertig getestet, io.copy (Null, Pullstat) Wird nicht funktionieren. –