2017-03-15 57 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)無法正常工作。 –