我想在 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。