为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
aluckdog 2023-03-21 14:52:26
我正在开发一个使用 Go Docker SDK 启动一些 Docker 容器的 Go 应用程序。我需要检查容器的进程是否以零(成功)状态代码退出。这是最小的工作示例: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)}如您所见,容器中的进程以非零状态 ( 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 检查容器进程以非零状态退出?
查看完整描述

2 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

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


查看完整回答
反对 回复 2023-03-21
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

select {case err := <-errCh:    if err != nil {
        log.Fatal(err)
    }case status := <-statusCh:
    log.Printf("status.StatusCode: %#+v\n", status.StatusCode)
}


查看完整回答
反对 回复 2023-03-21
  • 2 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信