runDockerInspect is a helper function that runs `docker inspect` on the given container IDs and returns the parsed output. The stderr output is also returned for logging purposes.
(ctx context.Context, execer agentexec.Execer, ids ...string)
| 311 | // container IDs and returns the parsed output. |
| 312 | // The stderr output is also returned for logging purposes. |
| 313 | func runDockerInspect(ctx context.Context, execer agentexec.Execer, ids ...string) (stdout, stderr []byte, err error) { |
| 314 | if ctx.Err() != nil { |
| 315 | // If the context is done, we don't want to run the command. |
| 316 | return []byte{}, []byte{}, ctx.Err() |
| 317 | } |
| 318 | var stdoutBuf, stderrBuf bytes.Buffer |
| 319 | cmd := execer.CommandContext(ctx, "docker", append([]string{"inspect"}, ids...)...) |
| 320 | cmd.Stdout = &stdoutBuf |
| 321 | cmd.Stderr = &stderrBuf |
| 322 | err = cmd.Run() |
| 323 | stdout = bytes.TrimSpace(stdoutBuf.Bytes()) |
| 324 | stderr = bytes.TrimSpace(stderrBuf.Bytes()) |
| 325 | if err != nil { |
| 326 | if ctx.Err() != nil { |
| 327 | // If the context was canceled while running the command, |
| 328 | // return the context error instead of the command error, |
| 329 | // which is likely to be "signal: killed". |
| 330 | return stdout, stderr, ctx.Err() |
| 331 | } |
| 332 | if bytes.Contains(stderr, []byte("No such object:")) { |
| 333 | // This can happen if a container is deleted between the time we check for its existence and the time we inspect it. |
| 334 | return stdout, stderr, nil |
| 335 | } |
| 336 | return stdout, stderr, err |
| 337 | } |
| 338 | return stdout, stderr, nil |
| 339 | } |
| 340 | |
| 341 | // To avoid a direct dependency on the Docker API, we use the docker CLI |
| 342 | // to fetch information about containers. |
no test coverage detected