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

Spring Integration FTP客户端在Docker中传输文件后挂起问题排查

Docker容器中FTP写入挂起的原因排查

问题描述

我用以下Java代码向FTP服务器发送数据,本地运行完全正常,但部署到Docker容器后,FTP服务器上能创建文件,也打印了Before writing the file named {} to FTP Server日志,但ftpSession.write方法一直挂起无法返回,请问可能的原因是什么?

public void sendData(BepReport bpReport) {

FtpSession ftpSession = defaultFtpSessionFactory.getSession();

StringBuilder buffer = new StringBuilder();
buffer.append(bpReport.getReportName());
buffer.append(bpReport.getContent());

InputStream is = new ByteArrayInputStream(
    buffer.toString().getBytes());

log.info("Before writing the file named  {} to FTP Server", DESTINATION);
try {
  ftpSession.write(is, DESTINATION);
} catch (IOException e) {
  log.error("Error ",e);
  throw new RuntimeException(e);
}
log.info("After writing the file named  {} to FTP Server", DESTINATION);
ftpSession.close();

}

可能的原因分析

  • FTP被动模式端口未打通:大部分FTP客户端默认使用被动模式(PASV),此时FTP服务器会开启随机端口与客户端建立数据连接。Docker容器默认处于隔离网络环境,若未在Docker配置中映射这些被动端口范围,或宿主机/内网防火墙未放行对应端口,数据连接会建立失败,导致write方法因等待数据传输而挂起。
  • 主动模式不兼容网络环境:如果代码配置为FTP主动模式(PORT),主动模式要求客户端开放端口供FTP服务器主动连接。Docker容器端口默认未对外映射,且多数NAT网络环境(如公司内网、云服务器)不支持主动模式的反向连接,会导致数据连接无法建立,写入操作卡住。
  • 容器网络策略限制:Docker的网络策略(如自定义bridge的iptables规则)或宿主机防火墙规则,可能阻断了容器与FTP服务器之间的数据连接流量。控制连接能建立(因此能创建文件),但数据连接被拦截,导致写入过程停滞。
  • FTP服务器被动模式地址配置错误:部分FTP服务器在被动模式下会返回内部IP地址(如服务器局域网IP),而容器无法访问该内部IP,导致数据连接无法建立,进而挂起写入操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:10:25