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

TestContainers FTP测试在GitLab构建时连接被拒绝求助

排查GitLab CI中Testcontainers FTP容器连接被拒绝问题

可能的原因及解决方案

1. GitLab Runner网络环境下的localhost指向异常

在GitLab CI使用Docker executor时,Runner本身运行在独立的Docker容器中,此时代码里的localhost指向的是Runner容器自身,而非宿主机,因此无法访问Testcontainers创建的FTP容器。

解决方法:

  • 在GitLab CI配置中添加环境变量,指定Testcontainers的宿主地址:
    variables:
      TESTCONTAINERS_HOST_OVERRIDE: "host.docker.internal"
    
  • 或修改代码,直接连接FTP容器的内部IP而非localhost:
    client.connect(ftp.getContainerIpAddress(), ftp.getMappedPort(PORT));
    

2. FTP被动模式端口未正常生效

虽然代码中固定了被动模式端口21000,但GitLab Runner的Docker环境可能存在端口流量限制,导致被动模式连接失败,进而触发主动连接被拒绝的连锁问题。

解决方法:

  • 临时切换为主动模式排查问题:
    client.enterLocalActiveMode(); // 禁用被动模式,使用主动模式连接
    
  • 确认GitLab Runner配置未限制端口范围,确保21000端口可正常访问。

3. 空用户名密码触发的登录限制

代码中USER和PASSWORD均为空字符串,部分FTP镜像在CI非本地环境下会默认禁用匿名登录,即使本地环境允许。

解决方法:

  • 设置非空的用户名和密码:
    private static final String USER = "testftp";
    private static final String PASSWORD = "test123";
    

4. CI环境下容器初始化延迟

GitLab CI的资源调度可能比本地慢,容器启动后FTP服务尚未完全就绪就执行连接操作,导致连接被拒绝。

解决方法:

  • 添加连接重试逻辑,等待服务就绪:
    int retryTimes = 3;
    boolean isConnected = false;
    while (retryTimes-- > 0 && !isConnected) {
        try {
            client.connect(ftp.getContainerIpAddress(), ftp.getMappedPort(PORT));
            isConnected = true;
        } catch (IOException e) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ie) {
                Thread.currentThread().interrupt();
            }
        }
    }
    if (!isConnected) {
        throw new IOException("FTP服务连接重试失败");
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 05:55:46