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

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

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

ftpClient.setTrustManager(TrustManagerUtils.getAcceptAllTrustManager());
ftpClient.setDataTimeout(1800000); //30 minutes
ftpClient.setBufferSize(1281000000);
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编写文件:

version: '2'
services:
  ingest:
    image: pl/ingest
    ports:
      - "8038:8038"

    volumes:
      - ./logs:/logs
      - ./processedFiles:/processedFiles

networks:                                
  default:                               
    driver: bridge                       
    driver_opts:                         
      com.docker.network.driver.mtu: 1500
9rygscc1

9rygscc11#

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

version: '2'
services:
  ingest:
    image: pl/ingest
    ports:
      - "8038:8038"
    volumes:
      - ./logs:/logs
      - ./processedFiles:/processedFiles
    network_mode: "host"

相关问题