如何使用 docker.sock 从在 Docker 中运行的应用程序连接到 MySQLContainer?

问题描述 投票:0回答:0

我想在 docker 中使用 MySQLContainer 运行 spring 集成测试。我将 volume 用于 docker.sock,但遇到了一些麻烦。 我有这样的 Dockerfile:

FROM gradle:7.6.1-jdk17-jammy as base
WORKDIR /app
COPY ./ ./
RUN gradle dependencies

FROM base as test
CMD ["gradle", "test"]

因此,在测试中我创建了 MySQLContainer 并设置了属性。

@SpringBootTest
class AutovillApplicationStarterTest {
    @ClassRule
    public static MySQLContainer mysql = new MySQLContainer<>("mysql:8.0")
        .withExposedPorts(3306, 3306)
        .withEnv("MYSQL_ROOT_HOST", "%")
        .withUsername("azamat")
        .withPassword("123456")
        .withDatabaseName("autovill")
        .withEnv("MYSQL_HOST", "%");

    static {
        mysql.start();

        System.out.println("MYSQL_HOST: " + mysql.getHost());
        System.out.println("MYSQL JDBC URL: " + mysql.getJdbcUrl());

        System.setProperty("spring.r2dbc.url", mysql.getJdbcUrl().replace("jdbc:", "r2dbc:"));
        System.setProperty("spring.r2dbc.username", mysql.getUsername());
        System.setProperty("spring.r2dbc.password", mysql.getPassword());

        System.setProperty("spring.flyway.url", mysql.getJdbcUrl());
        System.setProperty("spring.flyway.username", mysql.getUsername());
        System.setProperty("spring.flyway.password", mysql.getPassword());
    }

    @Test
    void contextLoads() {
    }
}

如果我直接使用 gradle test 运行它,效果很好。但是如果我通过 docker 运行它,会有一些麻烦:

建筑形象:

docker build -t spring-test --target=test . 

运行容器:

docker run \
--volume /var/run/docker.sock:/var/run/docker.sock \
-v $PWD:$PWD \
-w $PWD \
spring-test   

测试没有通过,我得到这样的异常:

Caused by: java.lang.IllegalStateException: Could not connect to Ryuk at 172.17.0.1:49157

我尝试使用 -e TESTCONTAINERS_HOST_OVERRIDE=host.docker.internal 参数来运行 docker。此外,我创建了网络并将其用于 MySQLContainer 和 docker run。

docker devops integration-testing spring-test testcontainers
© www.soinside.com 2019 - 2024. All rights reserved.