我正在開發(fā)一個(gè)使用 Go Docker SDK 啟動(dòng)一些 Docker 容器的 Go 應(yīng)用程序。我需要檢查容器的進(jìn)程是否以零(成功)狀態(tài)代碼退出。這是最小的工作示例:package mainimport ( "context" "io" "log" "os" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/docker/docker/client")func main() { ctx := context.Background() cli, err := client.NewEnvClient() if err != nil { log.Fatal(err) } reader, err := cli.ImagePull( ctx, "docker.io/library/alpine", types.ImagePullOptions{}, ) if err != nil { log.Fatal(err) } io.Copy(os.Stdout, reader) resp, err := cli.ContainerCreate(ctx, &container.Config{ Image: "alpine", Cmd: []string{"sh", "-c", "echo hello world; return 1"}, Tty: true, }, nil, nil, "") if err != nil { log.Fatal(err) } err = cli.ContainerStart( ctx, resp.ID, types.ContainerStartOptions{}, ) if err != nil { log.Fatal(err) } statusCh, errCh := cli.ContainerWait( ctx, resp.ID, container.WaitConditionNotRunning, ) select { case err := <-errCh: if err != nil { log.Fatal(err) } case <-statusCh: } out, err := cli.ContainerLogs( ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true}, ) if err != nil { log.Fatal(err) } io.Copy(os.Stdout, out)}如您所見,容器中的進(jìn)程以非零狀態(tài) ( sh -c "echo hello world; return 1") 結(jié)束。但是,它不會(huì)記錄任何致命錯(cuò)誤,只會(huì)hello world在構(gòu)建和執(zhí)行時(shí)顯示:{"status":"Pulling from library/alpine","id":"latest"}{"status":"Digest: sha256:7043076348bf5040220df6ad703798fd8593a0918d06d3ce30c6c93be117e430"}{"status":"Status: Image is up to date for alpine:latest"}hello world如何使用 Docker Go SDK 檢查容器進(jìn)程以非零狀態(tài)退出?
2 回答

隔江千里
TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超10個(gè)贊
我認(rèn)為您應(yīng)該使用狀態(tài)通道來(lái)獲取退出代碼。錯(cuò)誤通道似乎用于在與 docker 守護(hù)進(jìn)程對(duì)話時(shí)發(fā)出錯(cuò)誤信號(hào)

Smart貓小萌
TA貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊
select {case err := <-errCh: if err != nil { log.Fatal(err) }case status := <-statusCh: log.Printf("status.StatusCode: %#+v\n", status.StatusCode) }
- 2 回答
- 0 關(guān)注
- 141 瀏覽
添加回答
舉報(bào)
0/150
提交
取消