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

