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

如何使用Testcontainers为atmoz/sftp配置2222->22端口转发?

解决Testcontainers配置atmoz/sftp的端口映射问题

问题根源

你当前的配置错误在于混淆了主机端口和容器内部端口:

  • 控制台命令中-p 2222:22是将主机的2222端口映射到容器的22端口(SFTP默认监听端口)
  • 但你的Testcontainers代码中withExposedPorts(2222)错误地将容器的2222端口标记为暴露,而容器内部根本没有监听这个端口,导致启动失败;同时端口绑定的配置也没有明确指定映射关系。

正确配置代码

修改容器配置,明确暴露容器的22端口,并指定主机2222到容器22的映射:

import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.BindMode;
import java.util.Collections;

// 在JUnit4测试类中可结合@Rule声明容器
@Rule
public GenericContainer sftp = new GenericContainer("atmoz/sftp:latest")
        .withExposedPorts(22) // 暴露容器内部的SFTP默认端口22
        .withFileSystemBind(
                "/tmp/upload",
                "/home/foo/upload",
                BindMode.READ_WRITE)
        .withCommand("foo:bar:1001:::upload")
        .setPortBindings(Collections.singletonList("2222:22")); // 明确主机2222映射到容器22

验证效果

启动测试后,执行docker ps应该能看到类似如下的端口映射:

0.0.0.0:2222->22/tcp, :::2222->22/tcp

此时你可以用主机2222端口正常连接SFTP服务,和控制台命令的效果一致。

额外说明

  • Testcontainers默认会随机映射暴露的容器端口到主机端口,如果你不需要固定主机2222端口,也可以去掉setPortBindings,通过sftp.getMappedPort(22)获取主机侧的随机端口来连接,这样更适合测试环境避免端口冲突。
  • 确保主机的/tmp/upload目录存在且权限正确,否则可能出现挂载失败导致容器启动异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 21:05:55