You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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支持的日期格式。

三、构建命令的额外检查

确保你的构建命令满足以下条件:

  1. custom_network确实在启动builder容器前创建(你的命令已经做到了)。
  2. builder容器确实加入了custom_network(你的--network=custom_network参数配置正确)。
  3. 挂载的/var/run/docker.sock权限正常:你挂载/home/teamcity/.docker到/home/java/.docker已经处理了Docker配置的权限问题,这点没问题,但可以确认下builder容器内java用户是否有权限访问/var/run/docker.sock。

四、验证网络连通性(排查用)

如果调整后还是有问题,可以在builder容器内手动验证:

  1. 临时修改构建命令,用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
  1. 在容器内执行docker network inspect custom_network,确认Oracle容器是否在这个网络的Containers列表里。
  2. 用ping oracle-db(如果设置了网络别名)测试连通性,或者用telnet <oracle-container-ip> 1521测试端口是否开放。

按照这些步骤调整后,Testcontainers启动的Oracle容器应该能正常加入custom_network,测试也能正常获取端口并连接数据库了。

内容的提问来源于stack exchange,提问作者wemu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 14:03:10