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