2017-03-15 28 views
2

我正在尝试使用Docker的教程来重新创建docker run。下面是从网上的教程使用Golang API的Docker运行(Docker文档)

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

我这个看到的是,如果“高山”泊坞窗,在本地不可用,它不拉最新,最终抛出一个错误的问题下面的代码。 如 XXXXX $去运行,go_docker.go 恐慌:错误:没有这样的形象:高山

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 

但是当我运行命令行等效,我看到

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 

我试图寻找通过围棋客户端,我需要用ImagePull功能调整任何东西吗?任何帮助在这里将不胜感激!

这里是链接到文档https://docs.docker.com/engine/api/getting-started/

更新:我已经测试了Python版本相同的教程,和它的工作就好了。我想知道Golang页面是否需要更新。

+0

链接到教程? – johnharris85

+0

我的不好!应该加了这个!用文档更新了我的问题! – tw1stud

回答

0

码头客户端是开源的,用Go编写,所以你可以看到他们是如何实现他们的版本。我相信相关代码在container/create.go pullImage函数中。

+0

你能指出我需要做什么具体的调整来“创建”功能吗?我尝试追加“最新”字符串,但它没有帮助 – tw1stud

+0

问题是'在Golang中docker run的CLI等价物不起作用(至少从Docker在它的网站中有什么)。不完全确定它是否真的是我的本地码头配置的代码或东西。如果你可以在上面看到,等效的docker run命令可以正常工作 – tw1stud

+0

我不确定你的代码在哪里出问题,并且没有时间亲自尝试教程。上面的内容更多地回答了码头在他们的代码中执行的操作。 – BMitch

1

Image.Pull返回一个你必须读取和关闭的io.Reader;如果你不这样做,连接将在图像被拉出之前关闭。

您可以放弃它的内容并关闭它,然后拉动将起作用。

0

有同样的问题,“拉”似乎没有工作。尽管找到了修复程序。

1)修改拉线到

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

和ImagePull

我还没有试过之后添加

io.Copy(os.StdOut,pullstat) 

做一个

io.Copy(nil,pullstat) 

但是这在我的名单上请接下来尝试。

+0

刚完成测试,io.copy(nil,pullstat)无法正常工作。 –