`docker run`使用Golang API(Docker docs)

时间:2017-03-15 16:57:02

标签: docker go

我正在尝试使用Docker的教程来重新创建docker run。以下是在线教程

中的以下代码
 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)
}

我看到的问题是,如果' alpine' docker,在本地不可用,它不会提取最新信息,最终会抛出错误。   例如         XXXXX $ go go 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

我尝试通过Go客户端查看,是否需要使用ImagePull函数调整任何内容?任何帮助在这里将不胜感激!

以下是文档https://docs.docker.com/engine/api/getting-started/

的链接

更新:我测试了python版本的相同教程,它运行得很好。我想知道Golang页面是否需要更新。

2 个答案:

答案 0 :(得分:1)

有同样的问题,“拉”似乎没有起作用。虽然找到了修复。

1)将您的拉线修改为

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

并添加

io.Copy(os.StdOut,pullstat) 

在ImagePull之后

我没有尝试过做

io.Copy(nil,pullstat) 

但这是我接下来要尝试的事项列表。

答案 1 :(得分:0)

docker客户端是开源的,用Go编写,因此您可以确切了解他们是如何实现其版本的。我相信相关代码在container/create.go pullImage函数中。