以编程方式检查 Docker 容器进程是否以非零状态结束

我正在开发一个使用 Go Docker SDK 启动一些 Docker 容器的 Go 应用程序。我需要检查容器的进程是否以零(成功)状态代码退出。


这是最小的工作示例:


package main


import (

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

}

如您所见,容器中的进程以非零状态 ( sh -c "echo hello world; return 1") 结束。但是,它不会记录任何致命错误,只会hello world在构建和执行时显示:


{"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 检查容器进程以非零状态退出?


aluckdog
浏览 89回答 2
2回答

隔江千里

我认为您应该使用状态通道来获取退出代码。错误通道似乎用于在与 docker 守护进程对话时发出错误信号

Smart猫小萌

select&nbsp;{case&nbsp;err&nbsp;:=&nbsp;<-errCh:&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;err&nbsp;!=&nbsp;nil&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.Fatal(err) &nbsp;&nbsp;&nbsp;&nbsp;}case&nbsp;status&nbsp;:=&nbsp;<-statusCh: &nbsp;&nbsp;&nbsp;&nbsp;log.Printf("status.StatusCode:&nbsp;%#+v\n",&nbsp;status.StatusCode) }
打开App,查看更多内容
随时随地看视频慕课网APP