Java testcontainers oracle数据库容器在创建数据库用户之前启动

Java testcontainers oracle数据库容器在创建数据库用户之前启动,java,oracle,spring-boot,automated-tests,testcontainers,Java,Oracle,Spring Boot,Automated Tests,Testcontainers,我想对从数据源A(oracle)到数据源B(postgres)的导入命令进行自动化测试。 这两个数据源都应该使用testcontainers创建 基本设置已完成,但问题是: testcontainersoracleContainer在Dokerfile中定义的入口点进行更改以完成并创建测试所需的用户之前启动 容器运行后,将执行一些sql脚本来创建表并用数据填充它们。这些脚本失败,因为脚本中提到的用户尚未创建 testcontainers未等待完成设置 我将容器设置为: Orac

我想对从数据源A(oracle)到数据源B(postgres)的导入命令进行自动化测试。 这两个数据源都应该使用testcontainers创建

基本设置已完成,但问题是:

testcontainersoracleContainer在Dokerfile中定义的入口点进行更改以完成并创建测试所需的用户之前启动

容器运行后,将执行一些sql脚本来创建表并用数据填充它们。这些脚本失败,因为脚本中提到的用户尚未创建

testcontainers未等待完成设置


我将容器设置为:

        OracleContainer oracleContainer = new OracleContainer("webdizz/oracle-xe-11g-sa:latest")
            .withStartupTimeoutSeconds(10000)
            .withEnv("DATABASES", "xyz");
        oracleContainer.setWaitStrategy(new LogMessageWaitStrategy().withRegEx("*.Enjoy!*"));
数据库肯定是创建的,但在相当长的时间之后(通过永远运行测试并使用docker exec检查数据库进行测试)

我尝试以多种方式为容器设置等待策略,例如:

        OracleContainer oracleContainer = new OracleContainer("webdizz/oracle-xe-11g-sa:latest")
            .withStartupTimeoutSeconds(10000)
            .withEnv("DATABASES", "xyz");
        oracleContainer.setWaitStrategy(new LogMessageWaitStrategy().withRegEx("*.Enjoy!*"));
但没有任何结果


通过以下方式检查日志:

Slf4jLogConsumer logConsumer = new Slf4jLogConsumer(LOGGER);
    oracleContainer.followOutput(logConsumer);
我可以看到testcontainers从不等待它完成

我在网上找到的关于这个“bug”或“问题”的所有信息都是github上的BugReport:


看起来用户甚至使用了和我一样的容器。但是,问题中提到的解决方案对我不起作用。

我通过创建一个脚本(实际上是两个,但可以放在一个脚本中)来解决这个问题,该脚本检查数据库用户“XYZ”是否存在,如果存在,则返回0

等待检查。sh

#!/usr/bin/env bash
while :
do
    echo "waiting for user to exist"
    if $(/bin/bash /check_db_user.sh | grep -q XYZ); then
        echo "user XYZ exists"
        exit 0
    fi
done
检查\u db\u user.sh

#!/usr/bin/env bash
sqlplus -s /nolog <<EOF
connect username/password
select username from dba_users where username = 'XYZ';
quit
EOF
这是因为oracleContainer.execInContainer在默认情况下不会超时。它只是等到你所做的一切结束。
我在调试时发现了这一点,解决方案对我很有效。

您可以尝试重写OracleContainer的getTestQueryString

OracleContainer oracleContainer = new MyOracleContainer("webdizz/oracle-xe-11g-sa:latest")

...

public static class MyOracleContainer extends OracleContainer {
    public MyOracleContainer(String dockerImageName) {
        super(dockerImageName);
    }

    @Override
    public String getTestQueryString() {
        return "SELECT username FROM dba_users WHERE username = 'XYZ'";
    }
}