μ¬κΈ°μ λ¬΄μ¨ μΌμ΄ μΌμ΄λκ³ μλμ§ λͺ¨λ₯΄κ² μ§λ§ 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 , @DavidD ?
Ryukμ 무μμ΄λ©° localhost:32768 μμ μ€νλμ΄μΌ νλ μ΄μ λ 무μμ λκΉ
μ€, μ κΉ, λ°©κΈ μ΄κ²μ μ°Ύμμ΅λλ€: https://github.com/testcontainers/testcontainers-java/issues/3241
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"
λ§μμ, κ·Έλ κ² ν΄μΌ ν©λλ€.
BTW μ μ λμ λλ₯΄κ³ κ³μμμ€ :) 릴리μ€κ° μ€ν μ€μ λλ€.
μΆμ μλ£.. μ§κΈ Quarkus μ λ°μ΄νΈλ₯Ό νκ² μ΅λλ€.
μΆμ μλ£.. μ§κΈ Quarkus μ λ°μ΄νΈλ₯Ό νκ² μ΅λλ€.
νλ₯ν!
μ΄κ²μ΄ μ¬μ ν λ¬Έμ μ λκΉ?
λλ λ²κ·Έκ° μ¬μ ν μ‘΄μ¬νλ€κ³ μκ°νμ§λ§, κ·Έκ²μ κ²½νν μ μΌν μ¬λλ€μ μμ§ λ‘컬 μμ€ν μΌλ‘ κ°μ Έμ€μ§ μμ μ¬λλ€μ λλ€.
κ·Έλμ μ΄κ²μ΄ Postgres 12μμ 13μΌλ‘ λ§μ΄κ·Έλ μ΄μ ν λ ν μ€νΈ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ κ·Έλ μ΄λν΄μΌ ν΄μ λ°μν κ²μΈμ§ κΆκΈν©λλ€.
ν
μ€νΈ μ€ν μ¬μ΄μ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ¬μ©νλ 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 Pipelines)μ μμ§λ§ μ체μ μΌλ‘ μ 리λ₯Ό 보μ₯ν©λλ€.
tl;dr: Ryukμ λΉνμ±ννμ§ λ§μμμ€ ;)
JVMμ μ’ λ£νλ©΄ μ’ λ£ νν¬κ° μ€νλμ§ μκ³ μ»¨ν μ΄λκ° κ³μ μ€νλμ΄ λ§€λ¬λ¦° 컨ν μ΄λκ° μμ±λ©λλ€.
μ, TBH, μ λ νμ testcontainers.reuse.enable=true
μ€ννλ―λ‘ μ΄μ¨λ κ·Έλ κ² λ κ² κ°μ΅λλ€.
κ·Έλ¦¬κ³ κ· νμ μΌλ‘, 맀λ¬λ¦° 컨ν μ΄λλ μ€νλμ§ μλ ν μ€νΈλ³΄λ€ λ λμ©λλ€. :-)
νμ§λ§ νμ€ν, μ΄κ²μ΄ 1.15μμ μμ λλ€λ©΄(2μΌ μ μ λμ¨ κ² κ°μ΅λλ€), κ·Έκ²μ νλ₯νκ³ μ°λ¦¬λ λμ μ κ·Έλ μ΄λν κ²μ λλ€.
@bsideupμ λν΄
κ°μ₯ μ μ©ν λκΈ
testcontainers 1.15.0-rc2λ‘ λ³κ²½νλ©΄ λ¬Έμ κ° ν΄κ²°λ κ² κ°μ΅λλ€.