我不知道这里发生了什么,但似乎恰逢我将 Mac 上的 Docker 桌面更新到最新版本:
Gradle Test Executor 2 > org.hibernate.reactive.FilterTest > testFilterCollectionFetch FAILED
org.testcontainers.containers.ContainerLaunchException: Container startup failed
at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:330)
at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:311)
at org.hibernate.reactive.containers.PostgreSQLDatabase.getJdbcUrl(PostgreSQLDatabase.java:39)
at org.hibernate.reactive.containers.DatabaseConfiguration.getJdbcUrl(DatabaseConfiguration.java:78)
at org.hibernate.reactive.BaseReactiveTest.constructConfiguration(BaseReactiveTest.java:88)
at org.hibernate.reactive.FilterTest.constructConfiguration(FilterTest.java:26)
Caused by:
org.testcontainers.containers.ContainerFetchException: Can't get Docker image: RemoteDockerImage(imageName=postgres:13.0, imagePullPolicy=DefaultPullPolicy())
at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1279)
at org.testcontainers.containers.GenericContainer.logger(GenericContainer.java:613)
at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:320)
... 5 more
Caused by:
java.lang.IllegalStateException: Can not connect to Ryuk at localhost:32768
at org.testcontainers.utility.ResourceReaper.start(ResourceReaper.java:176)
at org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:168)
at org.testcontainers.LazyDockerClient.getDockerClient(LazyDockerClient.java:14)
at org.testcontainers.LazyDockerClient.listImagesCmd(LazyDockerClient.java:12)
at org.testcontainers.images.LocalImagesCache.maybeInitCache(LocalImagesCache.java:68)
at org.testcontainers.images.LocalImagesCache.get(LocalImagesCache.java:32)
at org.testcontainers.images.AbstractImagePullPolicy.shouldPull(AbstractImagePullPolicy.java:18)
at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:59)
at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:26)
at org.testcontainers.utility.LazyFuture.getResolvedValue(LazyFuture.java:20)
at org.testcontainers.utility.LazyFuture.get(LazyFuture.java:27)
at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1277)
... 7 more
java.lang.NullPointerException
at org.hibernate.reactive.BaseReactiveTest.after(BaseReactiveTest.java:156)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at io.vertx.ext.unit.junit.VertxUnitRunner.invokeTestMethod(VertxUnitRunner.java:95)
at io.vertx.ext.unit.junit.VertxUnitRunner.lambda$invokeExplosively$0(VertxUnitRunner.java:114)
at io.vertx.ext.unit.impl.TestContextImpl.run(TestContextImpl.java:90)
at io.vertx.ext.unit.junit.VertxUnitRunner.invokeExplosively(VertxUnitRunner.java:130)
at io.vertx.ext.unit.junit.VertxUnitRunner.access$000(VertxUnitRunner.java:39)
at io.vertx.ext.unit.junit.VertxUnitRunner$3.evaluate(VertxUnitRunner.java:217)
at io.vertx.ext.unit.junit.Timeout$1.evaluate(Timeout.java:45)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:110)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62)
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:119)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
at java.lang.Thread.run(Thread.java:748)
任何想法@Sanne , @DavideD ?
什么是 Ryuk,为什么它应该在localhost:32768 上运行
哦,等等,我刚刚发现这个: https :
PosgreSQL 最近发布了 13 版,因此我重新配置了我们的测试图像以使用图像postgres:13.0
。 好像下载不了?
奇怪的是,它应该与获取以前的版本没有什么不同。
PosgreSQL 最近发布了 13 版,因此我重新配置了我们的测试图像以使用图像
postgres:13.0
。 好像下载不了?
我认为——但我不确定——在我更新 Docker 之前,我已经在 Postgres 13 上使用了它。
我第一次听说Ryuk
.. 从我发现的极少数文档参考中,似乎应该启动一个可选的本地服务器?
它负责代表 Testcontainers 获取图像 - 因此没有新容器(例如 postgresql 13)会触发此操作。
似乎是 Testcontainers 中的一个错误。
您可以通过手动下载一次容器来解决它吗?
尝试
docker run --rm -it --name HibernateTestingPGSQL \
-e POSTGRES_USER=hreact -e POSTGRES_PASSWORD=hreact -e POSTGRES_DB=hreact \
-p 5432:5432 postgres:13.0
更改为 testcontainers 1.15.0-rc2 似乎为我修复了它。
凉爽的。
或者: https: //www.testcontainers.org/features/configuration/#disabling -ryuk
或者: https: //www.testcontainers.org/features/configuration/#disabling -ryuk
是的,这奏效了。
有没有正确的方法可以从 gradle 脚本设置环境变量?
显然:
test {
environment "TESTCONTAINERS_RYUK_DISABLED", "true"
对,应该可以。
顺便说一句,请坚持几分钟:) 发布正在运行
发布完成.. 我现在就做 Quarkus 更新。
发布完成.. 我现在就做 Quarkus 更新。
优秀!
这仍然是一个问题吗?
我相信这个错误仍然存在,但唯一会体验它的人是那些还没有将东西提取到他们本地机器上的人。
所以我想知道这是不是从Postgres 12迁移到13时需要升级test数据库导致的?
看,我设置了testcontainers.reuse.enable=true
,这可能会在测试运行之间重用数据库?
我不相信我们严格_需要_升级到 PostgreSQL 13 吗?
AFAIR 当我升级它时,我不需要进行任何相关的更改,所以我希望在 12 上一切正常 - 除非同时包含回归,但这似乎比 docker/ 出现一些问题的可能性要小测试容器。
也许尝试将配置恢复为 12 并查看?
我又遇到这种情况了:-(
看,我设置了
testcontainers.reuse.enable=true
,这可能会在测试运行之间重用数据库?
我将其设置为false,但并没有解决问题。
environment "TESTCONTAINERS_RYUK_DISABLED", "true"
这又修复了它。
@Sanne您认为我应该将此更改推送到 gradle 脚本吗?
是的,为什么不呢。 这似乎是一项新功能,到目前为止,我们一直很高兴没有它。
它负责代表 Testcontainers 获取图像 - 因此没有新容器(例如 postgresql 13)会触发此操作。
它实际上负责在运行测试后终止容器。 如果您终止 JVM,则不会执行关闭挂钩,容器将继续运行,从而创建悬空容器。
环境变量适用于无法使用 Ryuk 的 CI 系统(例如 BitBucket 管道),但它们保证自己进行清理。
tl;dr: 不要禁用 Ryuk ;)
如果您终止 JVM,则不会执行关闭挂钩,容器将继续运行,从而创建悬空容器。
好吧,TBH,我总是用testcontainers.reuse.enable=true
运行,所以我想无论如何都会发生这种情况。
而且,总的来说,悬空容器比我没有运行的测试更糟糕。 :-)
但是可以肯定的是,如果这在 1.15 中得到修复(我认为是两天前刚刚发布的),那就太好了,我们将改为升级。
感谢您解释@bsideup !
最有用的评论
更改为 testcontainers 1.15.0-rc2 似乎为我修复了它。