gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:03:40 30 4
gpt4 key购买 nike

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

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

testcontainers oracleContainer 在 Dokerfile 中定义的入口点发生更改以完成并创建测试所需的用户之前启动。

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

testcontainers 不等待完成设置。


我已经像这样设置了容器:

        OracleContainer oracleContainer = new OracleContainer("webdizz/oracle-xe-11g-sa:latest")
.withStartupTimeoutSeconds(10000)
.withEnv("DATABASES", "xyz");

数据库确实创建了,但是经过了相当长的时间(通过永远运行测试并使用 docker exec 检查数据库来测试)

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

        oracleContainer.setWaitStrategy(new LogMessageWaitStrategy().withRegEx("*.Enjoy!*"));

但它并没有产生任何结果。


通过检查日志:

Slf4jLogConsumer logConsumer = new Slf4jLogConsumer(LOGGER);
oracleContainer.followOutput(logConsumer);

我可以看到 testcontainers 从不等待它完成。

我在网上找到的关于这个“bug”或“问题”的所有信息都是 github 上的这个 BugReport: https://github.com/testcontainers/testcontainers-java/issues/1292

而且似乎用户甚至使用与我相同的容器。但是问题中提到的解决方案对我不起作用。

最佳答案

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

wait_check.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

check_db_user.sh:

#!/usr/bin/env bash
sqlplus -s /nolog <<EOF
connect username/password
select username from dba_users where username = 'XYZ';
quit
EOF

然后我运行 wait_check.sh:

oracleContainer.copyFileToContainer(
MountableFile.forClasspathResource("/helper/wait_check.sh"),
"/wait_check.sh");
oracleContainer.copyFileToContainer(
MountableFile.forClasspathResource("/helper/check_db_user.sh"),
"/check_db_user.sh");

try {
Container.ExecResult result = oracleContainer.execInContainer("./wait_check.sh");
log.debug(result.getStdout());
} catch (IOException | InterruptedException e) {
log.error(e.getMessage());
}

这是有效的,因为 oracleContainer.execInContainer 默认不会超时。它只是等到你所做的一切完成。我在调试时发现了这一点,该解决方案适用于我。

关于java - testcontainers oracle 数据库容器在创建数据库用户之前启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57529665/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com