我有多模块maven
项目。在测试的每个模块中,我将TestContainers
与docker-compose
一起使用。我用静态块创建了抽象类:
public abstract class AbstractIntegrationTest {
static final String MANAGEMENT_NODE_SERVICE_NAME = "ndb_mgmd";
static final int CLUSTERJ_NDB_PORT = 1186;
static final String MYSQL_NODE_SERVICE_NAME = "ndb_mysqld";
static final int MYSQL_PORT = 3306;
private static DockerComposeContainer dockerComposeContainer =
new DockerComposeContainer(
new File("src/test/resources/docker-compose.yml"))
.withLocalCompose(true)
.withExposedService(MANAGEMENT_NODE_SERVICE_NAME, CLUSTERJ_NDB_PORT)
.withExposedService(MYSQL_NODE_SERVICE_NAME, MYSQL_PORT);
static {
dockerComposeContainer.start();
}
}
我的docker-compose.yml
:
version: "3"
services:
ndb_mgmd:
image: mysql/mysql-cluster
command: 'ndb_mgmd'
volumes:
- ./mysql-cluster.cnf:/etc/mysql-cluster.cnf
networks:
cluster:
ipv4_address: 192.168.0.2
ndb_data_node_1:
image: mysql/mysql-cluster
command: 'ndbd'
depends_on:
- ndb_mgmd
networks:
cluster:
ipv4_address: 192.168.0.3
ndb_mysqld:
image: mysql/mysql-cluster
command: 'mysqld'
environment:
- MYSQL_DATABASE=TEST
- MYSQL_USER=sys
- MYSQL_PASSWORD=qwerty
depends_on:
- ndb_mgmd
- ndb_data_node_1
networks:
cluster:
ipv4_address: 192.168.0.10
networks:
cluster:
ipam:
driver: default
config:
- subnet: "192.168.0.0/16"
每个模块中都有这个类和撰写文件。
但是,当使用命令在根目录上运行ALL测试时:
mvn test
我看到第一个随机模块中的测试成功。但是,当测试在下一个模块中开始时,出现错误:
[Thread-3] ERROR [docker-compose] - Pool overlaps with other one on this address space
之所以发生这种情况,是因为在完成第一个模块的测试后未删除创建的子网。我看到了:
docker network ls
NETWORK ID NAME DRIVER SCOPE local
3c39948c8304 e1btqscnwrwu_cluster bridge local
9403e1c079b8 host host local
238981608b58 none null local
bf4cc57f9d5a scdf_default bridge local
名称为e1btqscnwrwu_cluster
的网络存在!但为什么?
因此,第一个模块的测试成功通过,其余所有模块都失败了。我不明白为什么第一个模块测试后网络没有删除?在多模块项目中如何使用TestContainers
有“最佳实践”吗?
我有:
TestContainers 1.11.2
docker-compose version 1.24.0, build 0aa59064
Docker version 18.09.0, build 4d60db4