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
相关产品推荐
相关产品推荐

