【问题标题】:Read time out when trying to list FTP server directory in Docker container on Linux尝试在 Linux 上的 Docker 容器中列出 FTP 服务器目录时读取超时
【发布时间】:2021-03-15 16:14:23
【问题描述】:

我有使用 LIST 命令轮询 FTP 服务器的服务。我使用本地被动模式,使用具有以下设置的 FTPSClient:

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

FTP 服务器目录中有大约 700,000 个文件,因此服务器响应需要时间。在我的本地机器上,通过启动原始 Java 应用程序,检索文件列表大约需要 5 分钟,在 Windows 上的 Docker 容器中,它也可以同时正常工作,FileZilla - 没问题,但时间更长。但是,当我在 Linux 机器(Ubuntu 18.04.4 LTS)上运行容器时,尽管它可以连接到服务器,但它无法检索数据。在超时设置的指定时间后,我收到:

原因:java.net.SocketTimeoutException:读取超时 java.net.SocketInputStream.socketRead0(Native Method) ~[?:?] at java.net.SocketInputStream.socketRead(SocketInputStream.java:115) ~[?:?] at java.net.SocketInputStream.read(SocketInputStream.java:168) ~[?:?] at 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) ~[?:?] at java.io.InputStreamReader.read(InputStreamReader.java:185) ~[?:?] at 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.initiateListParsing(FTPClient.java:3450) ~[app.jar:?] 在 org.apache.commons.net.ftp.FTPClient.initiateListParsing(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:?]

我想这不是防火墙的问题,因为我有类似的服务来轮询外部服务器并且它工作正常。两种服务都使用 Apache FTP 客户端库的本地被动模式。

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

【问题讨论】:

  • @MartinPrikryl 我可以通过命令行 FTP 客户端(不是 FTPS)检索列表。我通过运行 JAR 文件在没有 Docker 的情况下运行此应用程序,该文件使用 FTPS(实际上是 gradle 运行命令),它也可以列出目录。这一切都在 Linux 机器上。
  • 普通 FTP 在 Java 中工作,命令行 FTPS 客户端也可以工作。普通 FTP 在 Docker 中也不起作用。
  • 我的意思是命令行 FTP 客户端工作在与 Docker 容器不同的环境中,无论是普通的还是 FTPS。 Java JAR(gradle run)在相同的环境中工作 Docker 的容器不是普通的和 FTPS。普通的 FTP 和 FTPS(在 Java JAR 中)都不能在 Docker 的容器中工作。

标签: java docker ftp apache-commons-net


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2014-12-07
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多