Dockerfile testcontainers 无法连接到 Ryuk

Posted

技术标签:

【中文标题】Dockerfile testcontainers 无法连接到 Ryuk【英文标题】:Dockerfile testcontainers Can not connect to Ryuk 【发布时间】:2021-12-10 04:36:44 【问题描述】:

我尝试 dockerize 我的 java spring 应用程序。

在我的 build.gradle 中

implementation 'org.testcontainers:junit-jupiter'
implementation 'org.testcontainers:postgresql'

在我的测试文件中:

@SpringBootTest
class ApplicationTests 

@ClassRule
public static PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer("postgres:11.1")
    .withDatabaseName("integration-tests-db")
    .withUsername("sa")
    .withPassword("sa");

static class Initializer
    implements ApplicationContextInitializer<ConfigurableApplicationContext> 
    public void initialize(ConfigurableApplicationContext configurableApplicationContext) 
        TestPropertyValues.of(
            "spring.datasource.url=" + postgreSQLContainer.getJdbcUrl(),
            "spring.datasource.username=" + postgreSQLContainer.getUsername(),
            "spring.datasource.password=" + postgreSQLContainer.getPassword()
        ).applyTo(configurableApplicationContext.getEnvironment());
    

Dockerfile:

FROM adoptopenjdk/openjdk16:jdk-16.0.2_7-alpine-slim
MAINTAINER myapplication

ARG JAR_FILE=build/libs/myapplication-0.0.1-SNAPSHOT.jar

COPY $JAR_FILE myapplication-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-jar","/myapplication-0.0.1-SNAPSHOT.jar"]

然后我从终端运行:

docker build --no-cache  --tag=myapplication:latest .

docker run -v /var/run/docker.sock:/var/run/docker.sock -p8080:8080 myapplication:latest

毕竟我看到了一个错误:

2021-10-24 09:12:25.781 WARN [,,] 1 --- [containers-ryuk] o.testcontainers.utility.ResourceReaper:无法连接到 Ryuk 在 172.17.0.1:50582

java.net.ConnectException:连接被拒绝 java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na] at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:669) ~[na:na] at java.base/sun.nio.ch.NiosocketImpl.timedFinishConnect(NioSocketImpl.java:542) ~[na:na] 在 java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) ~[na:na] 在 java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:333) ~[na:na] 在 java.base/java.net.Socket.connect(Socket.java:645) ~[na:na] 在 org.testcontainers.utility.ResourceReaper.lambda$null$1(ResourceReaper.java:189) ~[testcontainers-1.16.0.jar!/:na] 在 org.rnorth.ducttape.ratelimits.RateLimiter.doWhenReady(RateLimiter.java:27) ~[duct-tape-1.0.8.jar!/:na] 在 org.testcontainers.utility.ResourceReaper.lambda$start$2(ResourceReaper.java:185) ~[testcontainers-1.16.0.jar!/:na] 在 java.base/java.lang.Thread.run(Thread.java:831) ~[na:na]

我做错了什么?不幸的是,经过两天的努力,我的想法已经用完了。

顺便说一句:我禁用了使用 gRPC FUSE 从 Docker 共享文件,但没有帮助。 我用的是macos。

【问题讨论】:

【参考方案1】:

根据Testcontainers docs,WORKDIR 应该与操作系统启动点具有相同的绝对路径。尝试添加这些配置

docker run -v /var/run/docker.sock:/var/run/docker.sock \
           -p 8080:8080 \
           -v $PWD:$PWD \
           -w $PWD \
            myapplication:latest

【讨论】:

【参考方案2】:

在运行命令后添加-e TESTCONTAINERS_HOST_OVERRIDE=docker.for.mac.host.internal

docker run -e TESTCONTAINERS_HOST_OVERRIDE=docker.for.mac.host.internal ...

【讨论】:

以上是关于Dockerfile testcontainers 无法连接到 Ryuk的主要内容,如果未能解决你的问题,请参考以下文章

测试容器:忽略来自 Dockerfile 的父“EXPOSE”指令

Spring testcontainers Driver org.testcontainers.jdbc.ContainerDatabaseDriver 声称不接受 jdbcUrl

testcontainers 方便的db测试框架

如何使用 Testcontainers 发送信号?

如何在多个 SpringBootTests 之间重用 Testcontainers?

SpringBoot 集成测试 Sybase 和 Testcontainers