Copying Data into Containers¶
Testcontainers-Python provides several ways to copy data into containers. This is essential for setting up test data, configuration files, or any other files needed for your tests.
Basic File Copy¶
The simplest way to copy a file is using the copy_file_to_container
method:
from testcontainers.generic import GenericContainer
with GenericContainer("alpine:latest") as container:
# Copy a single file
container.copy_file_to_container(
local_path="path/to/local/file.txt",
container_path="/path/in/container/file.txt"
)
Copying Multiple Files¶
You can copy multiple files at once:
with GenericContainer("alpine:latest") as container:
# Copy multiple files
container.copy_files_to_container([
("path/to/local/file1.txt", "/path/in/container/file1.txt"),
("path/to/local/file2.txt", "/path/in/container/file2.txt")
])
Copying Directories¶
You can copy entire directories:
with GenericContainer("alpine:latest") as container:
# Copy a directory
container.copy_directory_to_container(
local_path="path/to/local/directory",
container_path="/path/in/container/directory"
)
Copying with Permissions¶
You can set permissions for copied files:
with GenericContainer("alpine:latest") as container:
# Copy file with specific permissions
container.copy_file_to_container(
local_path="path/to/local/file.txt",
container_path="/path/in/container/file.txt",
permissions=0o644 # rw-r--r--
)
Copying with User¶
You can specify the owner of copied files:
with GenericContainer("alpine:latest") as container:
# Copy file with specific owner
container.copy_file_to_container(
local_path="path/to/local/file.txt",
container_path="/path/in/container/file.txt",
user="nobody"
)
Copying from Memory¶
You can copy data directly from memory:
with GenericContainer("alpine:latest") as container:
# Copy data from memory
data = b"Hello, World!"
container.copy_data_to_container(
data=data,
container_path="/path/in/container/file.txt"
)
Best Practices¶
- Use appropriate file permissions
- Clean up copied files
- Use absolute paths
- Handle file encoding
- Consider file size
- Use appropriate owners
- Handle file conflicts
- Consider security implications
Common Use Cases¶
Setting Up Test Data¶
def test_with_data():
with GenericContainer("alpine:latest") as container:
# Copy test data
container.copy_file_to_container(
local_path="tests/data/test_data.json",
container_path="/app/data/test_data.json"
)
# Copy configuration
container.copy_file_to_container(
local_path="tests/config/test_config.yaml",
container_path="/app/config/config.yaml"
)
Setting Up Application Files¶
def test_application():
with GenericContainer("myapp:latest") as container:
# Copy application files
container.copy_directory_to_container(
local_path="app/static",
container_path="/app/static"
)
# Copy templates
container.copy_directory_to_container(
local_path="app/templates",
container_path="/app/templates"
)
Setting Up Database Files¶
def test_database():
with GenericContainer("postgres:latest") as container:
# Copy database initialization script
container.copy_file_to_container(
local_path="tests/db/init.sql",
container_path="/docker-entrypoint-initdb.d/init.sql"
)
# Copy test data
container.copy_file_to_container(
local_path="tests/db/test_data.sql",
container_path="/docker-entrypoint-initdb.d/test_data.sql"
)
Troubleshooting¶
If you encounter issues with copying data:
- Check file permissions
- Verify file paths
- Check file encoding
- Verify file size
- Check container state
- Verify user permissions
- Check for file conflicts
- Verify disk space