Hibernate-reactive: ν…ŒμŠ€νŠΈκ°€ Docker λ°μŠ€ν¬νƒ‘μ—μ„œ μž‘λ™μ„ λ©ˆμ·„μŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2020λ…„ 10μ›” 04일  Β·  23μ½”λ©˜νŠΈ  Β·  좜처: hibernate/hibernate-reactive

μ—¬κΈ°μ„œ 무슨 일이 μΌμ–΄λ‚˜κ³  μžˆλŠ”μ§€ λͺ¨λ₯΄κ² μ§€λ§Œ 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 ?

bug testing

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

testcontainers 1.15.0-rc2둜 λ³€κ²½ν•˜λ©΄ λ¬Έμ œκ°€ ν•΄κ²°λœ 것 κ°™μŠ΅λ‹ˆλ‹€.

λͺ¨λ“  23 λŒ“κΈ€

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

λ„€, νš¨κ³Όκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

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에 λŒ€ν•΄

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰