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.
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"
)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")
])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"
)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--
)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"
)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"
)- 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
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"
)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"
)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"
)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