当前位置: 首页 > 知识库问答 >
问题:

NodeJS应用程序在容器化时停止工作[容器中的FTP服务器]

刘元青
2023-03-14

我正在尝试将ftp服务器NodeJS应用程序打包。当我使用npm运行它时,它工作得很好,但当我在容器中运行它时它没有响应。

这是节点应用程序:src/index.js文件

const FtpSvr = require ( 'ftp-srv' );

const hostname = '127.0.0.1';
const port = 21;

const ftpServer = new FtpSvr ({
url:`ftp://${hostname}:${port}`,
anonymous:true
} );

ftpServer.on('login', ({connection, username, password}, resolve, reject) =>
{
    resolve({root : "./"})

    connection.on('STOR', (error, fileName) => {
        console.log("STOR")
    });
});

ftpServer.on ( 'client-error', (connection, context, error) =>
{
    console.log ( `error: ${error}` );
});

ftpServer.listen().then(() => {console.log(`Server running at http://${hostname}:${port}/`);});

我的包.json 文件

{
  "name": "ftp-server",
  "version": "1.0.0",
  "description": "FTP server to receive images from cameras and save them on Azure Blob storage",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node src/index.js"
  },
  "author": "Rakshak",
  "license": "ISC",
  "dependencies": {
    "ftp-srv": "4.3.4"
  }
}

我的docker文件

FROM node:12

WORKDIR /app

COPY package.json ./

RUN npm install

COPY . .

EXPOSE 20-21
EXPOSE 65500-65515

CMD ["npm", "start"]

我正在使用FileZilla测试FTP服务器。当我使用npm运行服务器时,启动并使用FileZilla连接

Connecting to 127.0.0.1:5000...
Status:         Connection established, waiting for welcome message...
Status:         Insecure server, it does not support FTP over TLS.
Status:         Logged in
Status:         Retrieving directory listing...
Status:         Directory listing of "/" successful

我正在使用此命令构建docker映像

 docker build -t rrakshak/ftp-demo .

我用这个来运行码头

 docker run -p 5000:5000 rrakshak/ftp-demo:latest

这是FileZilla控制台上的消息

Connecting to 127.0.0.1:5000...
Status:         Connection established, waiting for welcome message...
Error:          Connection closed by server
Error:          Could not connect to server
Status:         Waiting to retry...
Status:         Connecting to 127.0.0.1:5000...
Status:         Connection established, waiting for welcome message...
Error:          Connection closed by server
Error:          Could not connect to server

当服务器在容器内运行时,FileZilla可以连接,但没有收到预期的文件列表响应。

------------更新-----------------------

将主机设置为0.0.0。在Filezilla上给我一组新消息

Status:         Connecting to 127.0.0.1:21...
Status:         Connection established, waiting for welcome message...
Status:         Insecure server, it does not support FTP over TLS.
Status:         Logged in
Status:         Retrieving directory listing...
Command:    PWD
Response:   257 "/"
Command:    TYPE I
Response:   200 Switch to "binary" transfer mode.
Command:    PASV
Response:   502 Command not supported
Command:    PORT 127,0,0,1,231,209
Response:   500 The given address is not yours
Error:          Failed to retrieve directory listing

为什么我的应用程序在节点中运行时有效,而在容器化时无效?

共有2个答案

邢小云
2023-03-14

尝试绑定到 0.0.0.0。由于您在 Docker 中运行,因此绑定到 127.0.0.1 不起作用,因为请求将来自外部(至少从 Docker 容器的角度来看)。

有关解决此类网络问题的提示,您可以在相关问题的答案中找到一些想法。

步致远
2023-03-14

监听容器中的< code>0.0.0.0:5000,并定义被动端口

const FtpSvr = require ( 'ftp-srv' );
  
const hostname = '0.0.0.0';
const port = 5000;

const ftpServer = new FtpSvr ({
  url: `ftp://${hostname}:${port}`,
  anonymous: true,
  pasv_url: `ftp://${hostname}:${port}`,
  pasv_min: 65500,
  pasv_max: 65515,
});

按原样构建容器,然后使用映射的以下端口运行,这些端口都可以在 ftp 连接中使用:

docker run -p 5000:5000 -p 65500-65515:65500-65515 --rm rrakshak/ftp-demo

给出响应:

$ curl ftp://localhost:5000
-rw-r--r-- 1 1 1          141 Oct 21 01:22 Dockerfile
drwxr-xr-x 1 1 1         4096 Oct 21 01:21 node_modules
-rw-r--r-- 1 1 1        21137 Oct 21 01:21 package-lock.json
-rw-r--r-- 1 1 1           52 Oct 21 01:21 package.json
-rw-r--r-- 1 1 1          660 Oct 21 01:23 server.js
-rw-r--r-- 1 1 1        20287 Oct 21 01:21 yarn.lock

ftp客户端必须设置为使用被动模式。

当 FTP 客户端处于活动模式时,FTP 服务器从客户端接收 PORT 命令,并创建一个新的 TCP 连接,从容器返回到客户端,以获取该端口上的数据。

由于Docker端口映射到容器中,此数据连接的源地址通常与FTP客户端用作FTP服务器初始目标的地址不匹配。在经典服务器上的NAT后面设置FTP服务器时也会出现类似的问题。

 类似资料:
  • 在独立AEM安装中,felix OSGi容器是否存在于jetty servlet容器中?或者Jetty服务器是作为捆绑包安装在Felix OSGi容器中的? AEM启动时,哪一个将首先启动? 对于基于战争的安装,这将如何改变? 根据这个答案,两者都是可能的。但我想知道AEM采用哪种方法。

  • 单击关闭程序后,浏览器中出现另一个错误: 详细的编译器输出如下所示: C:\程序文件(x86)\IIS Express>D:_myurl\bin\roslyn\csc.exe/T:Library/utf8output/nostdlib+/R:“C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll”/R:“C:\Windows\Micr

  • 我有个问题希望你能帮我解决。 有时,我的应用程序会出现一些错误,并继续在服务器上运行,直到我手动停止服务器并重新启动。

  • 我正在使用插件Goup-server-li的负载。 如何停止服务器? 我尝试了server.restart(),server.kill(),server.reset() 但总是有这样的错误: 未捕获错误:在Object.exports处侦听EADDRINUSE 127.0.0.1:35729_导出时出现errnoException(util.js:1022:11)_服务器上的exceptionWi

  • 错误:container_linux.go:247:启动容器进程导致“exec:\”-w\“:在$path中找不到可执行文件”c:\program files\docker toolbox\docker.exe:来自守护进程的错误响应:oci运行时错误:container_linux.go:247:启动容器进程导致“exec:\”-w\“:在$path中找不到可执行文件”。

  • 这里是android manifest的代码,这里是运行模拟器时调试错误消息的链接。当我点击Run或debug按钮时,模拟器出现了,但应用程序显示“AppName停止工作”,我感觉问题不是在android Manifest.xml中,就是在Java代码中。在android清单中,错误代码位于 “android:name=”com.example.quiz.FullScreenActivity“”