Copiar archivos en los contenedores
A veces es necesario inicializar un contenedor colocando archivos en una
ubicación específica. Por ejemplo, PostgreSQL ejecuta los scripts SQL ubicados en
/docker-entrypoint-initdb.d/ cuando el contenedor se inicia.
Crear el script de inicialización
Crea src/test/resources/init-db.sql:
create table customers (
id bigint not null,
name varchar not null,
primary key (id)
);Copiar el archivo en el contenedor
Utiliza withCopyFileToContainer() para copiar el script SQL en el directorio de
inicialización del contenedor:
package com.testcontainers.demo;
import static org.junit.jupiter.api.Assertions.assertFalse;
import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.testcontainers.postgresql.PostgreSQLContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.utility.MountableFile;
@Testcontainers
class CustomerServiceTest {
@Container
static PostgreSQLContainer postgres = new PostgreSQLContainer(
"postgres:16-alpine"
)
.withCopyFileToContainer(
MountableFile.forClasspathResource("init-db.sql"),
"/docker-entrypoint-initdb.d/"
);
CustomerService customerService;
@BeforeEach
void setUp() {
customerService =
new CustomerService(
postgres.getJdbcUrl(),
postgres.getUsername(),
postgres.getPassword()
);
}
@Test
void shouldGetCustomers() {
customerService.createCustomer(new Customer(1L, "George"));
customerService.createCustomer(new Customer(2L, "John"));
List<Customer> customers = customerService.getAllCustomers();
assertFalse(customers.isEmpty());
}
}El método withCopyFileToContainer(MountableFile, String) copia init-db.sql
desde el classpath hacia /docker-entrypoint-initdb.d/ dentro del contenedor.
PostgreSQL ejecuta automáticamente los scripts en ese directorio al iniciar.
También puedes copiar archivos desde cualquier ruta del host:
.withCopyFileToContainer(
MountableFile.forHostPath("/host/path/to/init-db.sql"),
"/docker-entrypoint-initdb.d/"
);