Quarkus Test, Postgres & Testcontainers

Yesterday I deleted all of my local Docker images and suddenly my setup with Quarkus and Testcontainers JDBC connection string (jdbc:tc:postgresql:latest:///test) didn't work anymore.

Caused by: org.flywaydb.core.internal.exception.FlywaySqlException: Unable to obtain connection from database: Acquisition timeout while waiting for new connection  
-----------------------------------------------------------------------------------------------
SQL State  : null  
Error Code : 0  
Message    : Acquisition timeout while waiting for new connection  
    at org.flywaydb.core.internal.jdbc.JdbcUtils.openConnection(JdbcUtils.java:60)

It seems that pulling the underlying containers for Postgres and Testcontainers causes this issue because that pulling takes a while. So you could implement a QuarkusTestResourceLifecycleManager and adjust the time:

package com.pikodat.common;

import io.quarkus.test.common.QuarkusTestResourceLifecycleManager;  
import org.testcontainers.containers.PostgreSQLContainer;  
import org.testcontainers.utility.DockerImageName;

import java.time.Duration;  
import java.util.Collections;  
import java.util.Map;

public class PostgresqlResource implements QuarkusTestResourceLifecycleManager {

    private final PostgreSQLContainer<?> postgres =
            new PostgreSQLContainer<>(
                    DockerImageName
                            .parse("postgres:latest"))
                    .withStartupTimeout(Duration.ofSeconds(30));

    @Override
    public Map<String, String> start() {
        this.postgres.start();
        return Collections.emptyMap();
    }

    @Override
    public void stop() {

    }
}

But some hours later I found an easier method. 🤦🏼‍♂️ Just add %test.quarkus.datasource.jdbc.acquisition-timeout=30 to your application.properties.