gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:40:52 25 4
gpt4 key购买 nike

我正在开发一个使用 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")。但是,它不会记录任何 fatal error ,只会在构建和执行时显示 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 检查容器进程以非零状态退出?

最佳答案

我认为您应该使用状态 channel 来获取退出代码。错误 channel 似乎用于在与 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)
}

关于docker - 以编程方式检查 Docker 容器进程是否以非零状态结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51849954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com