当前位置: 首页 > 面试题库 >

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

夹谷晋
2023-03-14
问题内容

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

这是最小的工作示例:

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


问题答案:

我认为您应该使用状态通道来获取退出代码。错误通道似乎用于通知与docker守护进程对话时是否有错误,请参阅https://godoc.org/github.com/docker/docker/client#Client.ContainerWait。

这对我有用:

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


 类似资料:
  • 问题内容: 如标题所述,我想以编程方式检查域的DNS响应是否受DNSSEC保护。 我该怎么办? 如果有Pythonic解决方案,那就太好了。 更新:更改了响应请求,对于您的困惑感到抱歉 问题答案: 使用DNS解析器(例如),您可以查询域的DNSKEY RRset并打开(dnssec OK)查询标志。如果查询成功,则答案将设置(已认证数据)标志,并将包含区域的RRSIG签名(如果已签名)。 更新:使

  • 问题内容: 如何检查Glassfish DAS是否以编程方式运行,即使已将其部署在本地计算机还是远程计算机上? 使用Java6 问题答案: 我找到了一种方法来检查DAS是否已启动,而不是Linux脚本。通过这种方式,我的应用程序和DAS都在同一台计算机上还是每台安装在不同的计算机上都没有关系。 }

  • 问题内容: 我正在编写一个非常简单的bash脚本,以快速检查我的容器仍在构建并正确启动,并且其中的应用程序能够响应请求。 有时会失败,例如因为我尝试将容器绑定到的端口已分配。但是当发生这种情况时,退出代码仍为0,因此我无法使用退出代码。如何以编程方式检查容器是否已正确启动? 我正在考虑的解决方案是: 解析输出中的错误 查看容器是否正在运行 但是这些似乎都有些过分和丑陋。我是否缺少更好的方法来检查是

  • 我正在编写一个非常简单的bash脚本,以快速检查我的容器是否仍然正确构建和启动,以及里面的应用程序是否响应请求。 有时会失败,例如,因为我试图将容器绑定到的端口已经分配。但是当这种情况发生时,的退出代码仍然是0,所以我不能使用退出代码。如何以编程方式检查容器是否正确启动? null

  • 问题内容: 我正在做一个项目,我们在Java服务和以其他各种语言编写的客户端之间进行大量的远程对象传输。考虑到我们当前的限制,我决定查看基于现有Java类生成代码所需要的内容。基本上,我需要获取一个文件(或它们的集合)来解析字节码,以确定所有数据成员,甚至可能是getter / setter,然后编写一些可以输出不同语言代码的内容,以创建具有相同结构的类。 我不是在寻找像JAD这样的标准反编译器。

  • 问题内容: 说我有两个JavaBeans 和。 如果创建一个Person对象的列表,我想编组成这样的东西: 可以使用这里描述的技术: 使用JAXB解组/编组List 通过使用和注释JaxbList,可以将其编组为上述XML。 但是,能够重用相同的类来封送对象列表也很好。实际上,我将有许多其他类型的bean。我可以这样: 但是,理想情况下,最好用类名的复数形式替换“列表”,用类名替换“ item”。