来自 Mesos Docker 容器的 FTP 不起作用

4
我有一个使用 Akka Streams 的 Scala 应用程序。因此,我的应用程序的流程如下:
1. Check if file exists on FTP - I'm doing it with the org.apache.commons.net.ftp.FTPClient
2. If it exists stream it via alpakka library(and make some stream transformations)

我的应用程序在本地工作,可以连接到服务器。

问题是当它被部署到dcos/mesos时,我遇到了一个问题:

java.io.IOException: /path/file.txt: No such file or directory

我可以确定文件仍然存在。此外,当我尝试通过ftp在docker容器中本地连接时,会出现以下情况:

ftp> open some.ftp.address.com
Connected to some.ftp.address.com.
220 Microsoft FTP Service
Name (some.ftp.address.com:root): USER
331 Password required
Password:
230 User logged in.
Remote system type is Windows_NT.
ftp> dir
501 Server cannot accept argument.
ftp: bind: Address already in use
ftp> 
2个回答

1

不确定是否仍然有帮助,但在将数据连接更改为被动模式后,我也能够从Docker容器内的FTP客户端传输数据。我认为主动模式需要客户端打开端口,服务器在返回文件列表结果和数据传输期间连接到这些端口。但是,客户端端口无法从Docker容器外部访问,因为请求未通过(就像在NAT网络中一样)。

发现了这篇解释主动/被动FTP连接的帖子

https://labs.daemon.com.au/t/active-vs-passive-ftp/182


1
所以我的问题非常奇怪。但我已经成功修复了。 快速回答:我是这样使用alpakka ftp库的:
Ftp
  .fromPath(url, user, pass, Paths.get(s"/path/$fileName"))

但是使用这种方法可以正常工作:
val ftpSettings = FtpSettings(
  host = InetAddress.getByName(url),
  port = 21,
  NonAnonFtpCredentials(user, pass),
  binary = true,
  passiveMode = true
)
Ftp
  .fromPath(Paths.get(s"/path/$fileName"), ftpSettings)

长一点的回答:我开始调查alpakka库,发现它使用了与我在检查文件是否存在时使用的相同库!
https://github.com/akka/alpakka/blob/master/ftp/src/main/scala/akka/stream/alpakka/ftp/impl/FtpOperations.scala

所以我开始探究,似乎将被动模式设置为true是解决方案。但很奇怪,因为我读到Windows FTP服务器不支持被动模式......希望有人能有一天澄清我的疑惑,但目前我很高兴它能正常工作 :)


这个解决方案是否意味着问题与DCOS无关? - Jacek Laskowski
实际上这与Docker容器有关,它无法从内部连接,但我可能仍然是错误的,因为我找到了解决方法,但并没有找到发生这种情况的原因。 - fr3ak
在 Docker 中添加 passiveMode = true 对我也解决了问题。谢谢。 - Dario Balinzo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接