java—在linux上尝试在docker容器中列出ftp服务器目录时读取超时

l7wslrjt  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(500)

我有一个用list命令轮询ftp服务器的服务。我使用本地被动模式,使用具有以下设置的ftpsclient:

  1. ftpClient.setTrustManager(TrustManagerUtils.getAcceptAllTrustManager());
  2. ftpClient.setDataTimeout(1800000); //30 minutes
  3. ftpClient.setBufferSize(1281000000);
  4. ftpClient.setControlKeepAliveTimeout(120);

ftp服务器目录中有大约700000个文件,所以服务器需要时间来响应。在我的本地机器上,通过启动原始java应用程序,检索文件列表大约需要5分钟,在windows上的docker容器中,它同样可以正常工作,filezilla—没有问题,但时间更长。但是,当我在linux机器上运行容器(ubuntu18.04.4lts)时,它无法检索数据,尽管它可以连接到服务器。在超时设置中指定的时间之后,我收到:
原因:java.net.sockettimeoutexception:读取在java.net.socketinputstream.socketread0(本机方法)~[?:?]在java.net.socketinputstream.socketread(socketinputstream)处超时。java:115)~[?:?]位于java.net.socketinputstream.read(socketinputstream。java:168)~[?:?]位于java.net.socketinputstream.read(socketinputstream。java:140)[?:?]在sun.nio.cs.streamdecoder.readbytes(streamdecoder。java:284)~[?:?]位于sun.nio.cs.streamdecoder.implread(streamdecoder。java:326)~[?:?]位于sun.nio.cs.streamdecoder.read(streamdecoder。java:178)~[?:?]位于java.io.inputstreamreader.read(inputstreamreader。java:185)~[?:?]位于java.io.bufferedreader.fill(bufferedreader。java:161)[?:?]在java.io.bufferedreader.readline(bufferedreader。java:326)~[?:?]在java.io.bufferedreader.readline(bufferedreader。java:392)~[?:?]位于org.apache.commons.net.ftp.ftpfileentryparserimpl.readnextentry(ftpfileentryparserimpl。java:53)~[app.jar:?]位于org.apache.commons.net.ftp.ftplistparseengine.readstream(ftplistparseengine)。java:142)~[app.jar:?]在org.apache.commons.net.ftp.ftplistparseengine.readserverlist(ftplistparseengine)。java:118)~[app.jar:?]位于org.apache.commons.net.ftp.ftpclient.initialistparsing(ftpclient。java:3450)~[app.jar:?]位于org.apache.commons.net.ftp.ftpclient.initialistparsing(ftpclient。java:3371)~[app.jar:?]在org.apache.commons.net.ftp.ftpclient.initiatelistparsing(ftpclient。java:3308)~[app.jar:?]位于org.my.org.ftp.ftpoperator.listdirectory(ftpoperator。java:30)~[app.jar:?]
我想这不是防火墙的问题,因为我有类似的服务,轮询外部服务器,它工作正常。这两个服务都使用apacheftp客户端库的本地被动模式。
docker编写文件:

  1. version: '2'
  2. services:
  3. ingest:
  4. image: pl/ingest
  5. ports:
  6. - "8038:8038"
  7. volumes:
  8. - ./logs:/logs
  9. - ./processedFiles:/processedFiles
  10. networks:
  11. default:
  12. driver: bridge
  13. driver_opts:
  14. com.docker.network.driver.mtu: 1500
9rygscc1

9rygscc11#

在docker compose中将网络模式从网桥更改为主机,使容器能够通过ftps/ftp列出文件:

  1. version: '2'
  2. services:
  3. ingest:
  4. image: pl/ingest
  5. ports:
  6. - "8038:8038"
  7. volumes:
  8. - ./logs:/logs
  9. - ./processedFiles:/processedFiles
  10. network_mode: "host"

相关问题