es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se puede ejecutar el contenedor usando testcontainers.

Estoy intentando implementar una prueba JUnit (v4.13.2) utilizando testcontainers (v1.16.2) para probar mejor nuestras clases DAO/JPA. Estoy utilizando la imagen oficial de docker centos/postgresql-96-centos7 y puedo ejecutarla en la línea de comandos sin problemas usando: docker run -d –name postgres -e POSTGRESQL_USER=user -e POSTGRESQL_PASSWORD=pass -e POSTGRES_DATABASE=db -p 5432:5432 centos/postgresql-96-centos7. Eliminé el contenedor antes de ejecutar la prueba unitaria para evitar conflictos en mi entorno de docker. Sin embargo, cuando ejecuto mi prueba, recibo consistentemente los siguientes errores:
java.lang.ExceptionInInitializerError. Causado por: org.testcontainers.containers.ContainerLaunchException: el inicio del contenedor ha fallado. Causado por: org.rnorth.ducttape.RetryCountExceededException: se ha alcanzado el límite de reintentos con la excepción. Causado por: org.testcontainers.containers.ContainerLaunchException: no se pudo crear/iniciar el contenedor. Causado por: java.lang.IllegalStateException: el contenedor ha salido con el código 2.

He intentado aumentar el valor de tiempo de espera a 5 minutos y simplificar el patrón de prueba JUnit4 (para evitar ejecutar un ambiente de prueba mixto) sin éxito. Solo incluyo el código de la clase abstracta porque lanza la excepción antes de llamar a POSTGRESQL_CONTAINER.start().

public abstract class AbstractRdbmsTest {
    private static final String DOCKER_IMAGE_NAME = "centos/postgresql-96-centos7";
    private static final String POSTGRESQL_USER = "user";
    private static final String POSTGRESQL_PASSWORD = "pass";
    private static final String POSTGRESQL_DATABASE = "db";

    protected static final PostgreSQLContainer POSTGRESQL_CONTAINER;

    static {
        DockerImageName imgName = DockerImageName.parse(DOCKER_IMAGE_NAME).asCompatibleSubstituteFor("postgres");

        POSTGRESQL_CONTAINER = (PostgreSQLContainer) new PostgreSQLContainer(imgName)
                .withDatabaseName(POSTGRESQL_DATABASE)
                .withUsername(POSTGRESQL_USER)
                .withPassword(POSTGRESQL_PASSWORD)
                .withExposedPorts(PostgreSQLContainer.POSTGRESQL_PORT);

        POSTGRESQL_CONTAINER.start();
    }
}

EDITAR: entorno Docker local:
Cliente/Servidor: Docker Engine – Community v20.10.7.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución

    El error indica que el arranque del contenedor falló, lo cual puede ser debido a una variedad de razones como un error de configuración, problemas de red o recursos insuficientes. Aquí hay algunos pasos que puede seguir para resolver el problema:

    1. Verifique los registros del contenedor docker para obtener más información sobre el error. Puede hacer esto ejecutando el siguiente comando:
      docker logs <container_id>
      

      Reemplace <container_id> con el ID del contenedor obtenido del comando docker ps.

    2. Asegúrese de tener la versión más reciente de la imagen postgres ejecutando el siguiente comando:

      docker pull postgres
      

    3. Aumente el valor de tiempo de espera de inicio para el contenedor. Puede hacer esto agregando la siguiente línea a su clase de prueba:
      @Container
      public static PostgreSQLContainer POSTGRESQL_CONTAINER = new PostgreSQLContainer()
             .withStartupTimeout(Duration.ofMinutes(5));
      

      Esto establece el tiempo de espera de inicio en 5 minutos.

    4. Verifique si tiene suficientes recursos (CPU, memoria) disponibles para ejecutar el contenedor. Puede verificar esto ejecutando el comando docker stats.

    5. Intente ejecutar el contenedor sin especificar los parámetros de base de datos, nombre de usuario y contraseña, y luego conéctese a él usando los valores predeterminados. Aquí hay un ejemplo:

      docker run -d --name postgres -p 5432:5432 postgres
      

      Luego, en su código Java, conéctese al contenedor usando los valores predeterminados:

      public static final PostgreSQLContainer<?> POSTGRESQL_CONTAINER =
         new PostgreSQLContainer<>("postgres:latest")
             .withDatabaseName("test")
             .withInitScript("init.sql");
      

    6. Si todo lo demás falla, intente usar una imagen diferente para el contenedor de PostgreSQL. Por ejemplo, puede intentar usar la imagen debezium/postgres.

    ¡Espero que esto ayude!

Comments are closed.