Ich versuche, mein PHP-Skript zu containerisieren.
Aber aus irgendeinem Grund kann keine Verbindung zu meinem FTP-Server hergestellt werden, wenn es in einem Container ausgeführt wird.
Führen Sie das Skript problemlos auf meinem lokalen Computer aus.
Dockerfile:
FROM php:8.1-cli EXPOSE 8080 KOPIEREN ./var/www/html/ ARBEITSVERZEICHNIS /var/www/html ENTRYPOINT php -f dienen.php
PHP-Skript:
$ Verbindung = ftp_connect(FTP_HOST, 21, 90); ftp_pasv($connection, true); if(ftp_login($connection, FTP_USERNAME, FTP_PASSWORD)) { $stream = fopen('data://text/plain,','r'); ftp_fput($connection, $filename, $stream); } ftp_close($connection);
Nach 90 Sekunden wird die folgende Warnung ausgegeben:
ftp_fput(): Connection timed out in /var/ www/html/ftp.php in Zeile 16
Ich habe versucht, in den Container zu gehen und den FTP-Client zu installieren.
Bei mir tritt ein ähnlicher Zeitüberschreitungsfehler auf: Ich kann eine Verbindung zum Host herstellen, aber die Ausführung eines beliebigen Befehls führt zu einer Pause.
Ich habe auch versucht, den Container auf einem VPS auszuführen, um lokale Firewall-/Netzwerkprobleme zu beseitigen.
Aber das Problem besteht immer noch.
Wenn Sie weitere Informationen zur Lösung des Problems benötigen, lassen Sie es mich bitte wissen.
注意 PHP 的
ftp_pasv
函数的文档(重点在我这里):还要注意您没有检查
ftp_pasv
调用的状态返回值,所以您不会注意到该调用是否实际成功(这很可能不会成功)。因此,您的脚本将尝试建立主动的 FTP 连接。这在容器中不起作用(除非使用--network=host
启动),因为容器在主机机器上通过 NAT 运行在私有网络中。解决方案:首先登录,然后启用被动模式(还要始终检查错误返回值;许多来自 PHP 标准库的旧函数不会引发异常,而是依赖于错误返回值):