如何使用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
相关产品推荐
相关产品推荐

