Ayer escribí sobre cómo hacer pruebas unitarias y de integración con Couchbase y TestContainers. Uno de los requisitos para esas pruebas era tener una imagen ya construida. Resulta que no hace falta. Puedes usar TestContainers para construir tus propias imágenes personalizadas justo antes de ejecutar tus pruebas y es súper fácil. Gracias a Sergei Egorov ¡por mostrarme el camino!
Creación de imágenes sobre la marcha
En el ejemplo anterior se instanciaría una imagen con el siguiente código:
1 2 3 4 5 6 |
@Regla de clase público estático ContenedorGenérico couchbase = nuevo ContenedorGenérico("mycouchbase:latest") .conPuertosExpuestos(8091, 8092, 8093, 8094, 11207, 11210, 11211, 18091, 18092, 18093) .waitingFor(nuevo CouchbaseWaitStrategy()); |
El constructor de GenericContainer tomaría un String como parámetro. Esa cadena es el nombre del contenedor que quieres probar. Pero el constructor GenericContainer también acepta un Future. Que resulta ser la clase ImageFromDockerfile. El Docker se creará de forma asíncrona con los parámetros que le indiques.
Aquí he copiado todo lo que necesitaba en la carpeta resources de mi proyecto, lo que hace que todos sean accesibles desde el classpath. Esta es la razón por la que uso el withFileFromClasspath
método. También puede obtener un Fichero a partir de una Cadena, una ruta absoluta o un fichero. Encontrará más información al respecto en Documentación sobre TestContainers.
1 2 3 4 5 6 7 8 9 10 11 |
@Regla de clase público estático ContenedorGenérico couchbase = nuevo ContenedorGenérico( nuevo ImageFromDockerfile().withFileFromClasspath("Dockerfile", "Dockerfile") .withFileFromClasspath("scripts/dummy.sh","scripts/dummy.sh") .withFileFromClasspath("scripts/entrypoint.sh","scripts/entrypoint.sh") .withFileFromClasspath("scripts/run","scripts/run") ) .conPuertosExpuestos(8091, 8092, 8093, 8094, 11207, 11210, 11211, 18091, 18092, 18093) .waitingFor(nuevo CouchbaseWaitStrategy()); |
Y con eso, su imagen Docker se construirá automáticamente antes de ejecutar sus pruebas. Por defecto las imágenes se borran al salir, pero puedes pasar una bandera para mantener las imágenes y evitar reconstruirlas todo el tiempo. Realmente depende de tu estrategia de pruebas.
Solución de problemas
Mientras escribía esto me encontré con un pequeño problema. Todos los recursos que se utilizaron para la creación de la imagen perdieron sus permisos, así que tuve que añadir un EJECUTAR chmod +x
en todos los recursos que copio en el Dockerfile. Esto es ahora un problema conocido y la gente encantadora y reactiva detrás de TestContainer está trabajando en ello. Puedes charlar con ellos en su canal de Slackal igual que puede charlar con la gente de Couchbase en nuestro canal comunitario.