Skip to content

Executing commands

Container startup command

By default the container will execute whatever command is specified in the image's Dockerfile. If you would like to send a CMD (command) to a container, you can pass it in to the container request via the Cmd field. For example:

req := ContainerRequest{
    Image: "alpine",
    WaitingFor: wait.ForAll(
        wait.ForLog("command override!"),
    ),
    Cmd: []string{"echo", "command override!"},
}

Executing a command

You can execute a command inside a running container, similar to a docker exec call:

c, _, err = container.Exec(ctx, []string{"touch", path})
if err != nil {
    t.Fatal(err)
}
if c != 0 {
    t.Fatalf("File %s should have been created successfully, expected return code 0, got %v", path, c)
}

This can be useful for software that has a command line administration tool. You can also get the logs of the command execution (from an object that implements the io.Reader interface). For example:

c, reader, err := container.Exec(ctx, []string{"ls", path})
if err != nil {
    t.Fatal(err)
}
if c != 1 {
    t.Fatalf("File %s should not have existed, expected return code 1, got %v", path, c)
}

buf := new(strings.Builder)
_, err = io.Copy(buf, reader)
if err != nil {
    t.Fatal(err)
}

// See the logs from the command execution.
t.Log(buf.String())

This is done this way, because it brings more flexibility to the user, rather than returning a string.