FTP 不适用于 mesos docker 容器
FTP does not work from mesos docker container
我有 akka steams 的 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>
所以我的问题真的很奇怪。但我已经设法解决了这个问题。
快速回答:我是这样使用 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
所以我开始挖掘,似乎 tahat 将被动模式设置为 true 是最有可能的解决方案。但这很奇怪,因为我读过 windows ftp 服务器不支持被动模式......
我希望有一天有人能澄清我的疑惑,但此刻我很高兴,因为它有效:)
不确定它是否仍然有用,但我也让我的 ftp 客户端在将数据连接更改为被动后从 Docker 容器内部传输数据。我认为主动模式要求客户端在返回文件列表结果和数据传输期间打开服务器连接到的端口。但是,无法从 docker 容器外部访问客户端端口,因为请求未通过(如在 NAT:et 网络中路由)。
找到这个 post 解释 active/passive FTP 连接
我有 akka steams 的 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>
所以我的问题真的很奇怪。但我已经设法解决了这个问题。 快速回答:我是这样使用 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
所以我开始挖掘,似乎 tahat 将被动模式设置为 true 是最有可能的解决方案。但这很奇怪,因为我读过 windows ftp 服务器不支持被动模式...... 我希望有一天有人能澄清我的疑惑,但此刻我很高兴,因为它有效:)
不确定它是否仍然有用,但我也让我的 ftp 客户端在将数据连接更改为被动后从 Docker 容器内部传输数据。我认为主动模式要求客户端在返回文件列表结果和数据传输期间打开服务器连接到的端口。但是,无法从 docker 容器外部访问客户端端口,因为请求未通过(如在 NAT:et 网络中路由)。
找到这个 post 解释 active/passive FTP 连接