You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang调用Docker API无法附加并跟踪容器日志问题求助

Troubleshooting Log Streaming from docker-newman Container via Go Docker API

Hey there! I’ve run into similar log streaming headaches with the Docker API in Go before, so let’s break down what might be going wrong here and fix it step by step.

Common Issues & Fixes

1. Missing Critical Flags in Log Request

The most common culprit is not enabling the right options when fetching logs. If you don’t set Follow: true or enable Stdout/Stderr, the API will only return existing logs (if any) and close the connection immediately—no real-time streaming.

Here’s how to properly configure the LogsOptions struct:

logsOpts := types.ContainerLogsOptions{
    ShowStdout: true,
    ShowStderr: true,
    Follow:     true,
    Timestamps: false, // Optional, toggle based on your needs
}

2. Failing to Handle the Streamed Response

Docker’s Logs endpoint returns a continuous stream, so you can’t just read it once with a one-off read call. You need to set up a loop to keep pulling data as it comes in.

Try this snippet to handle the stream correctly:

client, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
    panic(err)
}

// After confirming your container is running (replace with your container ID)
resp, err := client.ContainerLogs(context.Background(), "your-container-id", logsOpts)
if err != nil {
    panic(err)
}
defer resp.Close()

// Use a scanner to read logs line by line as they stream in
scanner := bufio.NewScanner(resp)
for scanner.Scan() {
    log.Println("Container Log:", scanner.Text())
}

if err := scanner.Err(); err != nil {
    log.Fatal("Error reading log stream:", err)
}

3. Double-Check Container Status (Even if Kitematic Says It’s Running)

Sometimes Kitematic shows a container as "running" but it’s actually restarting silently or exiting right after startup. Run this command to verify the real state:

docker inspect --format '{{.State.Status}} {{.State.Restarting}}' <your-container-id>

If it’s restarting, docker-newman might be finishing its test run and exiting immediately—meaning there’s no ongoing log stream to follow. You might need to adjust your container command to keep it running, or fetch logs after the container completes.

4. API Version or Permissions Mismatch

Ensure your Go app is using a Docker API version compatible with your daemon. You can force version negotiation with this client setup:

client, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())

Also, confirm the user running your Go app has permission to access the Docker socket (usually by being in the docker group).

Full End-to-End Example

Putting it all together, here’s a condensed workflow from pulling the image to streaming logs:

package main

import (
    "bufio"
    "context"
    "log"

    "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.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
    if err != nil {
        log.Fatal(err)
    }
    defer cli.Close()

    // Pull docker-newman image
    _, err = cli.ImagePull(ctx, "postman/newman:latest", types.ImagePullOptions{})
    if err != nil {
        log.Fatal(err)
    }

    // Create container (add your collection run command here if needed)
    resp, err := cli.ContainerCreate(ctx, &container.Config{
        Image: "postman/newman:latest",
        Cmd:   []string{"run", "your-collection-file.json"},
    }, nil, nil, nil, "")
    if err != nil {
        log.Fatal(err)
    }

    // Start container
    if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
        log.Fatal(err)
    }
    log.Println("Container started with ID:", resp.ID)

    // Stream logs
    logsOpts := types.ContainerLogsOptions{
        ShowStdout: true,
        ShowStderr: true,
        Follow:     true,
    }
    logResp, err := cli.ContainerLogs(ctx, resp.ID, logsOpts)
    if err != nil {
        log.Fatal(err)
    }
    defer logResp.Close()

    scanner := bufio.NewScanner(logResp)
    for scanner.Scan() {
        log.Println("Newman Log:", scanner.Text())
    }

    if err := scanner.Err(); err != nil {
        log.Fatal("Log stream error:", err)
    }
}

内容的提问来源于stack exchange,提问作者Nikole

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:23:25