在TeamCity中使用Testcontainers时容器无法加入自定义Docker网络
解决TeamCity中Testcontainers无法将Oracle容器加入自定义网络的问题
首先,你的核心问题确实是Testcontainers启动的Oracle容器没有加入你预先创建的custom_network,导致运行测试的builder容器与Oracle容器不在同一网络,无法正常通信,进而触发了端口获取失败的异常。另外那个日期解析异常大概率是旧版Testcontainers与Java 11的兼容性问题,我们一步步来解决:
一、正确配置Testcontainers复用已有的自定义网络
你尝试过withNetwork但没成功,问题出在网络的引用方式上。Testcontainers提供了专门的方法来直接引用宿主机上已存在的网络,而非手动构建Network对象。
修改测试代码如下:
@Testcontainers public abstract class OracleFlywayDatabaseTest { // 直接引用宿主机上已创建的custom_network private static final Network CUSTOM_NETWORK = Network.networkByName("custom_network"); @Container private static final OracleContainer oracle = new OracleContainer("registry/private/oracle/database:18c_xe") .withNetwork(CUSTOM_NETWORK) // 给Oracle容器设置网络别名,方便测试代码通过别名访问(避免依赖动态IP) .withNetworkAliases("oracle-db") .withUsername("TESTUSR") .withPassword("TESTPWD"); }
关键说明:
Network.networkByName("custom_network")会让Testcontainers直接复用你在构建命令中创建的宿主机网络,而非默认创建新的隔离网络。withNetworkAliases是可选但推荐的配置:测试代码里可以直接用oracle-db作为数据库主机名,不需要依赖容器的动态IP,进一步避免网络连通性问题。
二、解决日期解析异常
你遇到的DateTimeParseException是因为旧版本Testcontainers生成的日志日期格式包含了Java 11之前不支持的纳秒位数(比如2020-03-04T15:17:25.025952651+01:00的第29位是额外的纳秒数字)。解决办法二选一:
- 优先升级Testcontainers版本:升级到1.15.0及以上版本,这个版本已经修复了Java 11的日期解析兼容性问题。
- 临时调整日志格式:如果暂时无法升级,可以在构建命令中添加环境变量
-e TESTCONTAINERS_LOG_DATE_FORMAT="yyyy-MM-dd'T'HH:mm:ss.SSSXXX",强制Testcontainers使用Java 11支持的日期格式。
三、构建命令的额外检查
确保你的构建命令满足以下条件:
custom_network确实在启动builder容器前创建(你的命令已经做到了)。- builder容器确实加入了
custom_network(你的--network=custom_network参数配置正确)。 - 挂载的
/var/run/docker.sock权限正常:你挂载/home/teamcity/.docker到/home/java/.docker已经处理了Docker配置的权限问题,这点没问题,但可以确认下builder容器内java用户是否有权限访问/var/run/docker.sock。
四、验证网络连通性(排查用)
如果调整后还是有问题,可以在builder容器内手动验证:
- 临时修改构建命令,用
bash代替mvn verify进入容器:
docker run --rm -it -v $PWD:$PWD -w $PWD \ --privileged \ --network=custom_network \ -e TESTCONTAINERS_RYUK_DISABLED=true \ -e _JAVA_OPTIONS="" \ -e DOCKER_HOST="unix:///var/run/docker.sock" \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /home/teamcity/.docker:/home/java/.docker -v /local/maven/cache/repository:/opt/m2/repository \ registry.ch/java:11-builder \ bash
- 在容器内执行
docker network inspect custom_network,确认Oracle容器是否在这个网络的Containers列表里。 - 用
ping oracle-db(如果设置了网络别名)测试连通性,或者用telnet <oracle-container-ip> 1521测试端口是否开放。
按照这些步骤调整后,Testcontainers启动的Oracle容器应该能正常加入custom_network,测试也能正常获取端口并连接数据库了。
内容的提问来源于stack exchange,提问作者wemu
相关产品推荐
相关产品推荐

