Command Execution in Containers¶
Some test scenarios require running commands within a container.
In order to achieve this, the testcontainers
library provides the ability
to execute commands in 3 different ways:
exec
method of ContainerAsync (or Container)
Allows to run a command in an already running container.
Only if you implement your own Image
: Allows to define commands
to be executed after the container is started and ready.
Only if you implement your own Image
: Allows to define commands
to be executed executed after the container has started,
but before the Image::ready_conditions
are awaited for.
Here we will focus on the first option, which is the most common one. The method expects an ExecCommand struct, and returns an ExecResult struct.
ExecCommand¶
The ExecCommand struct represents a command to be executed within a container. It includes the command itself and conditions to be checked on the command output and the container.
ExecCommand Usage¶
To create a new ExecCommand:
let command = ExecCommand::new(vec!["echo", "Hello, World!"])
.with_container_ready_conditions(vec![/* conditions */])
.with_cmd_ready_condition(CmdWaitFor::message_on_stdout("Hello, World!"));
CmdWaitFor¶
The CmdWaitFor enum defines conditions to be checked on the command's output.
ExecResult / SyncExecResult¶
For async version, the ExecResult struct represents the result
of an executed command in a container.
For non-async (blocking
feature), the SyncExecResult struct is used instead.
The structs represents the result of an executed command in a container.
ExecResult Usage¶
To execute a command and handle the result:
let result = container.exec(command).await?;
let exit_code = result.exit_code().await?;
let stdout = result.stdout_to_vec().await?;
let stderr = result.stderr_to_vec().await?;